试图显示ProgressDialog中的AsyncTask在MapActivity执行

问题描述:

我有了类似这样的代码中的onCreate()一MapActivity:试图显示ProgressDialog中的AsyncTask在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创建处理程序()。我曾尝试将上下文参数设置为“this”,“ActivityName.this”,getApplicationContext()和getBaseContext()。

我对Android仍然很陌生,所以这种“上下文”的想法让我感到困惑。我更加困惑FirstAsyncTask工作,但SecondAsyncTask不工作。我发现在其他问题中提到了这个错误,但没有一个答案似乎有效。有任何想法吗?

编辑:在SecondSyncTask的构造函数中初始化ProgressDialog时引发异常。

的问题是在这里

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。

+0

谢谢,但这并不能解释为什么其中一个工作正常,另一个不是。 – jebar8 2012-08-07 03:40:41

+0

这是因为您正在向UI线程的不同线程构建progressdialog。你正在构建一个新线程产生的secondasynctask的构造函数。 – 2012-08-07 03:44:14

+0

这些AsyncTasks在应用中的多个活动中重复使用。他们没有在这个活动中宣布。 ProgressDialog在这个例子中只有一个问题。移动AsyncTask之外的对话是唯一的解决方法吗? – jebar8 2012-08-07 03:47:31

写您的对话解雇代码中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; 
} 
+0

查看修改。之前应该提到这一点。问题是在构造函数中初始化ProgressDialog。 – jebar8 2012-08-07 03:38:37

+0

检查我的编辑.. – Nishant 2012-08-07 03:45:10