我正在使用Android AsyncTask,我希望在我的程序加载过程中创建一个进度条。这是我如何做到的。
A class is declared here...
private ArrayList<String> result1 = new ArrayList<String>(); //class variable
onCreate()
{
Some stuff here...
new ATask().execute();
for (int i = 0; i <result1.size();i++)
{
output = output +result1.get(i) + "\n\n";
}
textView.setText(output);
}
private void do0()
{
ArrayList<Sentence> result = new ArrayList<Sentence>();
ArrayList<String> result2 = new ArrayList<String>();
result = do1("link", true); //just some function I am working
result1 = do2(result,10);//do2 return ArrayList<String>
}
private class ATask extends AsyncTask<String, Void, String>{
private ProgressDialog progress = null;
@Override
protected String doInBackground(String... params) {
do0();
return null;
}
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected void onPostExecute(String result) {
progress.dismiss();
//adapter.notifyDataSetChanged();
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
progress = new ProgressDialog(ReadWebPage.this);
progress.setMessage("Doing...");
progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progress.show();
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
};
我的意图是,在加载进度条时,它将完成do0()
并修改result1
,然后我的oncreate
可以使用result1
来显示它是TextView
。但是,此TextView
在此设置中始终为空。所以我移动了
for (int i = 0; i <result1.size();i++)
{
output = output +result1.get(i) + "\n\n";
}
textView.setText(output);
进入do0()
(在result1 = do2()
之后),但程序将崩溃。我不熟悉这些线程设置,感谢您的帮助。
答案 0 :(得分:2)
问题在于代码的设计。 AsyncTask
异步发生,因此只要您在AsyncTask
上调用执行,onCreate
的其余部分就会立即执行。 AsyncTask
基本上会在新主题上运行,并与您的Activity
并行执行。
我认为您想要的是在TextView
的{{1}}方法中设置onPostExecute
。在AsyncTask
完成后调用onPostExecute
。
此外,请务必记住doInBackground
在后台线程中发生,因此您无法从其中的代码更改doInBackground
UI。 Activity's
在UI线程上运行,因此您可以在那里进行UI更改,但这些方法中的任何代码也会阻止UI。
答案 1 :(得分:2)
使用包含在主线程上初始化的Handler
对象的线程,您将获得更好的服务。使用处理程序,您可以post()
在主线程上执行小片段 - 比如更新进度条。您可以从AsyncTask执行相同的Handler技巧,但IMHO线程更清晰。
所述片段应实现为Runnable
s。随意使用嵌套的匿名类一行。