即使我正在使用onCreateDialog和onShowDialog,也会泄露窗口

时间:2012-03-12 16:41:29

标签: android android-asynctask android-dialog

我已实施Asynctask+orientation change method by CommonsWare

基本上,它的作用是,当设备旋转时,活动会被破坏。因此,在活动销毁的最后阶段,它将AsyncTask与活动分离并将其传递给新活动。创建新活动时,我将AsyncTask附加回新活动。

注意:我没有在清单中使用android:configChanges="orientation,因为我需要不同的纵向和横向布局。

一切正常。

众所周知,有correct way to display dialogs我正在使用它。

这也可以。

当我尝试同时使用这两种方法时出现问题。

当我使用showDialog(n)调用时,我的对话框会显示出来。如果我旋转设备一次,一切正常。但是当我再次旋转然后logcat记录E/WindowManager(10035): ActivityMainActivity has leaked window DecorView@40520998 that was originally added here应用程序没有崩溃。之后,每次旋转设备时,logcat都会开始记录相同的错误,但不会崩溃。

代码(主要活动):

public class MainActivity extends BaseActivity {

private static final int RATE_US = 1;
private MainPageAsync task = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    showDialog(RATE_US);

    task = (MainPageAsync) getLastNonConfigurationInstance();

    if (task == null) {
        task = new MainPageAsync(this);
        task.execute(super.currentPage);
    } else {
        task.attach(this);
    }

}

@Override
public Object onRetainNonConfigurationInstance() {

    // remove activity from asynctask
    if (task != null)
        task.detach();

    return task;
}

@Override
protected Dialog onCreateDialog(int id) {

    if (id == RATE_US) {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("test")
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                //dosomethinghere
                            }
                        });
        return builder.create();
    } else {
        return super.onCreateDialog(id);
    }
}

}

代码(AsyncTask):

public class MainPageAsync extends AsyncTask<String, String, Document> {

private MainActivity a;

public MainPageAsync(MainActivity activity) {
    this.a = activity;
}

public void detach() {
    a = null;
}

public void attach(MainActivity activity) {
    this.a = activity;
}


@Override
protected Document doInBackground(String... params) {

//network work

}

@Override
protected void onPostExecute(final Document doc) {

//more work on UI thread

}

}

1 个答案:

答案 0 :(得分:-1)

DecorView是Android的系统用户界面 - 操作/状态栏。也许这不是你的错。