在我们需要创建多个异步任务的情况下,例如当一个活动需要创建多个循环视图(或片段)时,我们可以重用相同的旋转进度条小部件,直到完成所有异步任务。异步调用可用于通过网络或数据库加载数据或更平滑的长时间运行任务。由于异步任务发生在后台线程中,尝试从主线程启动微调器并从后台线程关闭微调器会导致类型“ CalledFromWrongThreadException
”的异常,这意味着只有创建视图层次结构的原始线程才能触及它观点。
这可以通过创建两个变量来完成,一个用于存储请求的数量,另一个用于存储已完成的请求数。假设异步任务是调用类的内部类。在调用异步任务之前,请求的数量会增加。并且完成的请求数增加onPostExecute
了async
类的功能。进度条在调用类中初始化。进度条的可见性设置为visible
在async
课程开始时。onPost
执行后隐藏进度条的可见性,并且仅当请求数等于已完成的请求数时。简单!
下面,我概述了一些主要步骤。我希望我能扩展这篇文章,以便在将来使用完整的工作代码添加更多细节。
我定义了两个private
变量来计算调用异步任务的活动中的异步任务。一个计数器跟踪已经请求的任务,另一个是已完成的数量。
private int AsyncTaskCount = 0; //tracks number of requests completed
private int AsyncTaskRequested = 0; //tracks number of requests
private ProgressBar spinner; //defined the progressBar
初始化onCreate
调用类的方法的进度条。
spinner = (ProgressBar)findViewById(R.id.progressbar);
在调用之前更新请求的发言数asynctask
:
AsyncTaskRequested = 2; //we are requesting two asynctasks
new NetworkQueryTask().execute(SmartStockConstant.QueryMarket);
new NetworkQueryTask().execute(SmartStockConstant.QueryStock);
在asynctask
班级中,更新AsyncTaskCount
的doInBackground
,并设置进度条visible
:
class NetworkQueryTask extends AsyncTask<String, Void, ArrayList<Stock>> {
private String query;
@Override
protected ArrayList<Stock> doInBackground(String... params) {
AsyncTaskCount++; //track the executed
spinner.setVisibility(View.VISIBLE); //set the bar visible
最后,onPostExecute
检查已完成任务的数量是否等于请求的数量并使其progressBar
不可见:
@Override
protected void onPostExecute(ArrayList<Stock> searchResults) {
super.onPostExecute(searchResults);
//main logic here
if(AsyncTaskCount == AsyncTaskRequested) {
spinner.setVisibility(View.GONE);
}
}
}