从MainActivity中删除AsyncTask中的对话框

时间:2015-04-30 17:39:52

标签: android android-asynctask

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

 }

1 个答案:

答案 0 :(得分:1)

更改

private class LoadAndStoreDataTask extends AsyncTask   <String,  Integer, String> {

    private ProgressDialog nDialog;

private class LoadAndStoreDataTask extends AsyncTask   <String,  Integer, String> {

所以任务将使用MainActivity nDialog字段而不是LoadAndStoreDataTask类中的字段