java - 尝试在 MapActivity 中执行的 AsyncTask 中显示 ProgressDialog

标签 java android android-asynctask progressdialog

我有一个 MapActivity,其 onCreate() 中的代码与此类似:

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 无效。我在其他问题中多次看到这个错误,但似乎没有一个答案有效。有什么想法吗?

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

最佳答案

问题就在这里

myLocationOverlay.runOnFirstFix(new Runnable() {
    new SecondAsyncTask(lat, lon, ActivityName.this).execute((Object[]) null);
}

SecondAsyncTask 正在新生成的线程上构造。不是 UI 线程。

在 Activity 中创建一个进度对话框。然后从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 中。

一旦所有这些工作正常,您将需要设置标志,以便只有在两项任务完成后才关闭进度对话框。

关于java - 尝试在 MapActivity 中执行的 AsyncTask 中显示 ProgressDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11838874/

相关文章:

javascript - 为什么touchmove只能用于文档

Android异步任务: Only the original thread that created a view hierarchy can touch its views

java - AsyncTask 仅适用于调试?

java - 在 Android Studio 中更改使用 renderManager 的应用程序中的字体

java - 为什么我的 `unmodifiableList` 是可修改的?

java - XText:交叉引用找不到引用

android - 在 RecycleView 中有效加载数据

java - 使用 SpringBoot 使用 Batch 从 Kafka 读取数据无法正常工作

android - 添加到 Android 主屏幕时,create-react-app 无法正常工作

android - Android/iOS 上的 Base64 编码图像