выполнение приостановки активности, которая не возобновляется после метода воссоздания

У меня есть проект для HoneyComb, и я получаю сообщение об ошибке после использования метода recreate() в методе onResum() в моей основной деятельности.

11-10 22:05:42.090: E/ActivityThread(1917): Performing pause of activity that is not     resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main}
11-10 22:05:42.090: E/ActivityThread(1917): java.lang.RuntimeException: Performing pause of activity that is not resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main}
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2517)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2505)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2483)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread.access$700(ActivityThread.java:122)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.os.Looper.loop(Looper.java:132)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread.main(ActivityThread.java:4123)
11-10 22:05:42.090: E/ActivityThread(1917):     at java.lang.reflect.Method.invokeNative(Native Method)
11-10 22:05:42.090: E/ActivityThread(1917):     at java.lang.reflect.Method.invoke(Method.java:491)
11-10 22:05:42.090: E/ActivityThread(1917):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
11-10 22:05:42.090: E/ActivityThread(1917):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
11-10 22:05:42.090: E/ActivityThread(1917):     at dalvik.system.NativeStart.main(Native Method)

Я создаю новый проект, чтобы показать вам, что происходит.

Вы можете найти его по адресу http://xp-dev.com/svn/RecreateError/trunk/< /а>

Я не знаю, в чем моя вина, но я запускаю Activity и регистрирую жизненный цикл Activity. Результат:

11-10 22:26:45.960: I/seasons log(2274): onCreate()
11-10 22:26:45.990: I/seasons log(2274): onStart()
11-10 22:26:45.990: I/seasons log(2274): onResume()

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

11-10 22:30:26.390: I/seasons log(2274): onPause()
11-10 22:30:27.080: I/seasons log(2274): onStop()

И вернитесь к моей деятельности с активированным флагом воссоздания, что будет сделано recreate() в onResume().

11-10 22:33:05.500: I/seasons log(2274): onCreate()
11-10 22:33:05.510: I/seasons log(2274): onStart()
11-10 22:33:05.510: I/seasons log(2274): onResume()
11-10 22:33:05.510: I/seasons log(2274): onPause()

при паузе? Но моя Активность видна, что я делаю не так? Правильный статус не onResume()?

И теперь, если я переключаюсь на другое приложение, я получаю сообщение об ошибке.

Спасибо за ваше время и извините за мой плохой английский.


В настоящее время я не понимаю, как такие приложения, как File Manager HD, выполняют это действие.

Два действия: основное действие A, действие B с PreferenceFragment в качестве основного содержимого.

Один вариант, который меняет тему между Holo и Holo.Light, Activity B изменяется с помощью метода OnSharedPreferenceChangeListener в PreferenceFragment, но когда мы возвращаемся к методу Main Activity recreate() в onResume(), происходит сбой, как это сделать?

Я в замешательстве. Извиняюсь.


person seasonsend    schedule 10.11.2011    source источник


Ответы (3)


Для этого используйте обработчик:

Handler handler = new Handler() {
       @Override
        public void handleMessage(Message msg) {
           if(msg.what==MSG_RECREATE)
               recreate();
        }
};

@Override
protected void onResume() {
    if(condition) {
        Message msg = handler.obtainMessage();
        msg.what = MSG_RECREATE;
        handler.sendMessage(msg);
    }
}

Это больше не рухнет.

person Philippe Mignard    schedule 07.06.2013
comment
Я считаю, что он все равно рухнет, если вы не позвоните super.onResume() :) - person nicopico; 08.06.2013

Я не знаю, является ли это причиной ваших проблем, но вы не сравниваете такие строки в Java;

protected void onResume() {
    ...
    if (recreate == "S") {
        recreate = "N";
        recreate();
    }

Вместо этого используйте if ("S".equals(recreate)).

person harism    schedule 10.11.2011
comment
UPS. В реальном приложении этого кода нет, но спасибо. Большая ошибка для меня. - person seasonsend; 11.11.2011

Вы никогда не должны звонить onPause onCreate onResume и т. д. самостоятельно. Вам не нужно использовать recreate() для того, что вы хотите сделать, поместите код инициализации в другое место, если он нуждается в обновлении. Кроме того, используйте целое число для хранения состояния программы вместо строки, затем объявите некоторые конечные переменные для ссылки, например.

public final int RECREATE_ON = 1;
public final int RECREATE_OFF = 2;
private int recreate = RECREATE_OFF;

...

if(recreate==RECREATE_ON){
    recreate();
}

Помните, что делает recreate():

Заставьте это действие воссоздаться с новым экземпляром. Это приводит к тому же процессу, что и при создании Activity из-за изменения конфигурации — текущий экземпляр пройдет свой жизненный цикл до onDestroy(), а после него будет создан новый экземпляр.

Вот почему вы получаете сообщение onPause.

person Dororo    schedule 10.11.2011
comment
Я не вызываю onPause, onCreate, onResume самостоятельно. Но вы правы с воссозданием. Я использую это в своем приложении, потому что в PreferenceFragment я меняю тему между holo и Holo.light, и мне нужно воссоздать действие, когда я вернусь, чтобы увидеть изменения. - person seasonsend; 11.11.2011
comment
Я думаю, вы не должны решать, что нужно другим людям. Если вы не знаете решения, просто не отвечайте. - person Michael; 28.03.2014