【问题标题】:ProgressDialog(context) in AsyncTask causes Error "Activity has leaked window"AsyncTask 中的 ProgressDialog(context) 导致错误“活动已泄漏窗口”
【发布时间】:2017-08-07 02:31:24
【问题描述】:

我正在尝试将 Fragment 转换为 Activity,但遇到了一些麻烦。 我有 3 个使用 Intent 运行的活动:

MainActivity -> DetailsActivity -> MyPagerActivity

PagerActivity 做了一些 UI 工作,并在最后调用 AsyncTask 将一些数据发送到我的服务器。我的 ASyncTask 在一个单独的 Java 文件中,我使用“MyPagerActivity.this”作为上下文调用该函数:

NetFuncs nu = new NetFuncs();
...
nu.FinishWork(MyPagerActivity.this, workData1, WorkData2);

在 NetFuncs 中:

private Context mContext;
....
public void FinishWork(Context context, String Data1, long Data2) {
     if (networkUtils.isNetworkAvailable(context)) {
        new FinishWorkServerCall(context, Data1, Data2).execute();
     }
private class FinishWorkServerCall extends AsyncTask<Void, Void, Void> {
    public class FinishWorkServerCall (Context context, String Data1, long Data2) {
        mContext = context;
        ...
   }
   @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
                pDialog = new ProgressDialog(mcontext);
                pDialog.setMessage("Finishing your work...");
                pDialog.setCancelable(false);
                pDialog.show();
    }
    @Override
    protected Void doInBackground(Void... arg0) {
     ....
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if ( pDialog != null && pDialog.isShowing()) {
            pDialog.dismiss();
            pDialog = null;
        }
    }

在 Fragment 世界中,一切都很顺利。一旦我转移到一个独立的活动,就在 pDialog.show();应用程序崩溃并出现以下错误:

Activity com.example.MyPagerActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{7acbcb8 V.E...... R......D 0,0-1026,348} that was originally added here

我用谷歌搜索了很多,每个人都在谈论 postExecute() 和 onDestroy() 中的解雇,我正在做这两个,但它没有帮助。 我认为问题是上下文问题,但我不知道问题可能是什么以及如何解决它。我用过getApplicationContext()、getBaseContext(),都没有用。 我用 Toast() 代替了同样的问题,所以我猜这是一个 contetx 问题。

编辑: pDialog 正在进行时,MyPagerActivity 没有关闭或完成。它保持不变。

有人可以帮我找出问题所在并帮助找到解决方案吗?

谢谢

【问题讨论】:

  • 添加完整的日志跟踪。
  • 在fragment中添加FinishWork调用的代码

标签: android android-fragments android-asynctask


【解决方案1】:

只需将其包装在 try/catch 块中:

try {
   pDialog.show();
} cath (Exception ignored) {
   // do nothing, activity keeps working
}

附:这是一个“黑客”,但问题仍然存在。通常,当您的 Activity 在 AsyncTask 工作期间重新创建时,会发生“已泄漏窗口”。如果 porgress 在 onDestroy() 方法中显示,您可以尝试关闭它。

【讨论】:

    【解决方案2】:
    private class FinishWorkServerCall extends AsyncTask<Void, Void, Void> {
        public class FinishWorkServerCall (Context context, String Data1, long Data2) {
            mContext = context;
            pDialog = new ProgressDialog(mcontext);
            pDialog.setMessage("Finishing your work...");
            pDialog.setCancelable(false);
       }
       @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
                    if (pDialog != null) {
                        pDialog.show();
                    }
        }
    

    【讨论】:

      【解决方案3】:

      我想我刚刚找到了解决方案: 我添加了一个处理程序:

              h = new Handler(Looper.getMainLooper());
              h.post(new Runnable() {
                  public void run() {
                      pDialog = new ProgressDialog(mcontext);
                      pDialog.setMessage("Finishing your work...");
                      pDialog.setCancelable(false);
                      pDialog.show();
      
                  }
              });
      

      并在处理程序中执行 pDialog。它解决了崩溃的问题......不知道为什么,但确实如此。有人可以帮我理解为什么会这样吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-09
        • 1970-01-01
        • 2011-08-07
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 2013-12-23
        • 1970-01-01
        相关资源
        最近更新 更多