AsyncTask中的ProgressDialog(context)导致错误“Activity has leaked window”

时间:2017-08-07 02:31:25

标签: android android-fragments android-asynctask

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

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;
        }
    }

在片段世界中,一切都很美妙。我一转到独立活动,就在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

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

编辑: 当pDialog正在进行时,我的MyPagerActivity不会关闭或完成。它保持不变。

有人可以帮我弄清问题是什么,并帮助找到解决方案吗?

谢谢

3 个答案:

答案 0 :(得分:0)

将其包装在try / catch块中:

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

P.S。这是一个“黑客”,但问题仍然存在。当你的Activity在AsyncTask工作期间重新创建时,Ussualy会发生“泄漏窗口”。如果它在onDestroy()方法中显示,你可以尝试解除porgress。

答案 1 :(得分:0)

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();
                }
    }

答案 2 :(得分:-2)

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

        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。它解决了崩溃的问题......不确定为什么,但确实如此。有人可以帮我理解为什么会这样吗?