Java 进程对话框出现泄漏的windows错误

Java 进程对话框出现泄漏的windows错误,java,android,android-asynctask,progressdialog,Java,Android,Android Asynctask,Progressdialog,我在显示带有异步任务的进度对话框时遇到问题: Activity has leaked window com.android.internal.policy.PhoneWindow$DecorView{8cee959 V.E...... R......D 0,0-1026,252} that was originally added here 这是我的异步任务: public class MyClientTask extends AsyncTask<Void, Void, Void>

我在显示带有
异步任务的
进度对话框
时遇到问题:

Activity has leaked window com.android.internal.policy.PhoneWindow$DecorView{8cee959 V.E...... R......D 0,0-1026,252} that was originally added here
这是我的异步任务:

public class MyClientTask extends AsyncTask<Void, Void, Void> {
    private ProgressDialog progressDialog = null;

    private Context mContext;

    MyClientTask(Context mContext) {
        this.mContext = mContext;

    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(mContext);
        progressDialog.setMessage("Working ...");
        progressDialog.setIndeterminate(false);
        progressDialog.setCancelable(false);
        progressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        try {
            wait(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        if (progressDialog != null) {
            progressDialog.dismiss();
            progressDialog = null;
        }

    }
}
public class ConnectionActivity extends Activity {

    final private Context mContext = this;
    private Button buttonConnect;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R .layout.activity_socketconnection);

        buttonConnect = (Button) findViewById(R.id.buttonConnect);

        buttonConnect.setOnClickListener(getConnectOncOnClickListener());
    }

    private OnClickListener getConnectOncOnClickListener() {
        return new OnClickListener() {

            @Override
            public void onClick(View v) {
                MyClientTask myClientTask = new MyClientTask(mContext);
                try {

                        myClientTask.execute();
                        myClientTask.get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }

            }
        };
    }

}

我搜索了解决方案,但它无论如何都不起作用

这通常发生在您在完成活动时,没有先调用dismise()或隐藏对话框。我建议您稍微修改一下代码,在活动中创建实际的ProgressDialog,然后存储对它的引用。在onDestroy()中,作为预防措施,请检查它是否为null并显示,然后将其取消。

一些提示:

  • 在活动中保留对
    ProgressDialog
    的引用,并添加公共方法来显示/隐藏它

  • AsyncTask
    中使用
    WeakReference
    ,让垃圾收集器完成它的工作

  • 摆脱阻塞UI线程的
    myClientTask.Get()


  • 问题是在后台调用wait()。请看一看

    样本:

     private Object lock = new Object();
    
        @Override
        protected Void doInBackground(Void... arg0) {
    
            synchronized(lock) {
                try {
                    lock.wait(5000);
                    //  Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            return null;
        }
    
    使用progressDialog.cancel();而不是progressDialog.discouse()

    您可以在此处找到它们之间的差异:


    可能是@Tigger的副本我读过,但这不是我的问题。。这个解决方案不起作用我试着按照你的建议去做,但不起作用错误是一样的..可能是,你在前一个任务完成之前启动了一个新的异步任务吗?不,我从来没有启动过另一个。。所以我不明白我为什么会有这个问题