试图显示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。
写您的对话解雇代码中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;
}
谢谢,但这并不能解释为什么其中一个工作正常,另一个不是。 – jebar8 2012-08-07 03:40:41
这是因为您正在向UI线程的不同线程构建progressdialog。你正在构建一个新线程产生的secondasynctask的构造函数。 – 2012-08-07 03:44:14
这些AsyncTasks在应用中的多个活动中重复使用。他们没有在这个活动中宣布。 ProgressDialog在这个例子中只有一个问题。移动AsyncTask之外的对话是唯一的解决方法吗? – jebar8 2012-08-07 03:47:31