android - 从 MainActivity 关闭 AsyncTask 中的对话框

标签 android android-asynctask

MainActivity 中,我有一个 AsyncTask,其中显示了一个 ProgressDialog,从 onPreExecute() 开始> 。如果 doInBackground() 中的处理崩溃,那么我会得到这个异常:
Activity us.nm.state.mmd.MainActivity 已泄漏窗口 com.android.internal.policy.impl.PhoneWindow$DecorView

我相信它正在发生,因为在 Activity 停止时对话框仍在显示。我看到的 AsyncTask/Progress 对话框的例子都在 AsyncTask 类中有对话框。 我想尝试关闭 Activity.onPause() 方法中的对话框(如下所示),但由于对话框在 AsyncTask 类中声明,MainActivity 确实可以访问它。

我将对话框的实例化移动到 MainActivity。所以 onPause() 确实得到了调用并且调用了 dismiss() 发生了,但是这是在设备上出现“Unfortunately MyApp has stopped”消息很久之后。

我该怎么做?

public class MainActivity extends AppCompatActivity  implements ActionBar.TabListener {

    private ProgressDialog nDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

         nDialog = new ProgressDialog(mainActivity);
        nDialog.setMessage(resources.getString(R.string.loading));
         nDialog.setTitle(resources.getString(R.string.loading));
         nDialog.setIndeterminate(false);
         nDialog.setCancelable(false);

         String url = "http://----------------------------------------";
        Fragment myFragment = mTabsPageAdapter.getItem(TabsPagerAdapter.MY_TAB);
        new LoadAndStoreDataTask((OnLoadAndStoreCompleteListener)permitsFragment, nDialog).execute(url);
    }

    @Override
    public void onPause(){
        super.onPause();
        if(nDialog != null)
            nDialog.dismiss();
    }
}

private class LoadAndStoreDataTask extends AsyncTask   <String,  Integer, String> {

    private ProgressDialog nDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Resources resources = getResources();

         nDialog.show();
    }

    protected String doInBackground(String... urls) {
        ....
    }

    @Override
    protected void onPostExecute(String result) {
       if (nDialog != null) {
            nDialog.dismiss();
        }
    }

    @Override
    protected void onCancelled() {
    if (nDialog != null) {
        nDialog.dismiss();
    }

 }

最佳答案

改变

private class LoadAndStoreDataTask extends AsyncTask   <String,  Integer, String> {

    private ProgressDialog nDialog;

private class LoadAndStoreDataTask extends AsyncTask   <String,  Integer, String> {

因此该任务将使用 MainActivity nDialog 字段而不是 LoadAndStoreDataTask 类中的字段

关于android - 从 MainActivity 关闭 AsyncTask 中的对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29974359/

相关文章:

java - 向左/向右滑动事件

android - 异步任务在 OnclickListener 中崩溃

java - 如何从 AsyncTask 更新 View ?

java - 如何仅在 doinbackground 中的方法完成时调用 onPostExecute?

java - 无法从嵌套json改造android studio中获取值(value)

android - 如何从 UI 线程运行特定类型的任务?

java - 无法正确格式化 setText()

android - 如何将 TextView 和图像结合起来并返回图像?

java - ProgressDialog 未显示在 onPreExecute() 中

android - 异步任务 : Should I check for isCanceled() in onPostExecute()?