Утечка окна, даже если я использую onCreateDialog и onShowDialog - PullRequest
0 голосов
/ 12 марта 2012

Я реализовал Asynctask + метод изменения ориентации от CommonsWare .

По сути, это то, что когда устройство поворачивается, действие уничтожается.Таким образом, на последнем этапе уничтожения действия он отключает AsyncTask от действия и передает его новому действию.Когда создается новое действие, я присоединяю AsyncTask к новому действию.

Примечание: я не использовал android:configChanges="orientation в манифесте, потому что мне нужны были разные макеты для портретной и альбомной ориентации..

Все отлично работает.

Как мы все знаем, существует правильный способ отображения диалогов , и я его использую.

Это также отлично работает.

Проблема возникает, когда я пытаюсь использовать оба этих метода вместе.

Мои диалоги появляются, когда я его вызываюс 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 голосов
/ 12 марта 2012

DecorView - это системный интерфейс Android - строка действий / состояния.Может быть, это не твоя вина.

...