在MainActivity
中,我有一个AsyncTask
,其中显示ProgressDialog
,从onPreExecute()
开始。如果doInBackground()
中的处理崩溃,那么我得到这个例外:
活动us.nm.state.mmd.MainActivity已泄露窗口com.android.internal.policy.impl.PhoneWindow $ DecorView
我相信它正在发生,因为在活动停止时仍然显示对话框。我看到AsyncTask / Progress对话框的示例都在AsyncTask
类中有对话框。
我想尝试在Activity.onPause()方法中解除对话框(如下所示),但由于在AsyncTask
类中声明的对话框,MainActivity
确实可以访问它。
我将对话框的实例化移动到MainActivity
。因此,onPause()
确实会收到被叫,并且对dismiss()
的调用也会发生,但是在设备上显示消息“不幸的MyApp已停止”之后很长时间。
我该怎么做?
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();
}
}
答案 0 :(得分:1)
更改
private class LoadAndStoreDataTask extends AsyncTask <String, Integer, String> {
private ProgressDialog nDialog;
到
private class LoadAndStoreDataTask extends AsyncTask <String, Integer, String> {
所以任务将使用MainActivity nDialog字段而不是LoadAndStoreDataTask类中的字段