我在onCreate()中有一个类似于此代码的MapActivity:
if(...) {
...
new FirstAsyncTask(id, this).execute((Object[]) null);
...
} else {
...
myLocationOverlay.runOnFirstFix(new Runnable() {
new SecondAsyncTask(lat, lon, ActivityName.this).execute((Object[]) null);
}
...
}
FirstAsyncTask和SecondAsyncTask都做了不同的事情,但它们都显示了ProgressDialog,如下所示:
public FirstAsyncTask(long id, Context context) {
progressDialog = new ProgressDialog(context);
}
protected void onPreExecute() {
...
progressDialog.show();
}
protected String doInBackground(Object... params) {
...
progressDialog.dismiss();
...
}
这与FirstAsyncTask一起使用,但无论我在对SecondAsyncTask的调用中发生什么变化,它总是会失败并出现此错误:无法在未调用Looper.prepare()的线程内创建处理程序。我已经尝试将context参数设置为“this”,“ActivityName.this”,getApplicationContext()和getBaseContext()。
我对Android仍然很陌生,所以这种“背景”的想法令我感到困惑。我对FirstAsyncTask的工作原理更加困惑,但SecondAsyncTask却没有。我已经看到这个错误在其他问题中提到了很多,但没有一个答案似乎有效。有什么想法吗?
编辑:在SecondAsyncTask的构造函数中初始化ProgressDialog时抛出异常。
答案 0 :(得分:1)
在onPostExecute()
方法中编写对话解除代码,它将运行UI线程中的代码
@Override
protected void onPostExecute(Void result) {
progressDialog.dismiss();
}
以这种方式编写AsyncTask类:
private class FirstAsyncTask extends AsyncTask<String, Void, Void> {
ProgressDialog myDialog = null;
@Override
protected void onPreExecute() {
myDialog = ProgressDialog.show(YourActivityClass.this, "",
"Loading Data...");
return;
}
@Override
protected Void doInBackground(String... urls) {
//Your code which you want to run in background
return null;
}
@Override
protected void onPostExecute(Void result) {
myDialog.dismiss();
return;
}
}
如果已将AsyncTask类定义为Activity的内部类,则上面的代码可以正常工作。如果你的AsyncTask类被定义为一个单独的类,那么你必须将活动的上下文传递给它的构造函数
ProgressDialog myDialog = null;
Context context;
public FirstAsyncTask (Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
myDialog = ProgressDialog.show(context, "",
"Loading Data...");
return;
}
答案 1 :(得分:1)
问题出在这里
myLocationOverlay.runOnFirstFix(new Runnable() {
new SecondAsyncTask(lat, lon, ActivityName.this).execute((Object[]) null);
}
正在新生成的线程上构造SecondAsyncTask。不是UI线程。
在活动中创建一个progressDialog。然后从Asynctasks访问Activity的progressDialog。
public class MyActivity extends Activity {
ProgressDialog mProgressDialog;
onCreate(...){
mProgressDialog = new ProgressDialog();
}
private class MyAsyncTask extends AsyncTask<...> {
...
onPreExecute(...){
mProgressDialog.show();
}
onPostExecute(...){
mProgressDialog.dismiss();
}
}
private class MyAsyncTask2 extends AsyncTask<...> {
...
onPreExecute(...){
mProgressDialog.show();
}
onPostExecute(...){
mProgressDialog.dismiss();
}
}
不要尝试从doInBackground执行progressDialog.dismiss(),而是将其放在UI线程中运行的postExecute中。
一旦所有这些工作正常,您将需要设置标记,这样您只有在两个任务完成后才会关闭progressdialog。