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