首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >执行在重新创建方法后未恢复的活动的暂停

执行在重新创建方法后未恢复的活动的暂停
EN

Stack Overflow用户
提问于 2011-11-10 21:40:15
回答 3查看 13.7K关注 0票数 11

我有一个HoneyComb项目,在我的主要活动中使用onResum()方法重新创建()方法后会出现一个错误。

代码语言:javascript
运行
复制
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/找到它

我不知道是什么错,但我开始活动,并记录活动的生命周期。结果:

代码语言:javascript
运行
复制
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()

现在我按下Action图标来激活重新创建的标志并切换到其他应用程序..。

代码语言:javascript
运行
复制
11-10 22:30:26.390: I/seasons log(2274): onPause()
11-10 22:30:27.080: I/seasons log(2274): onStop()

并返回到我的活动中,使用重新创建标志激活了将在onResume()完成的重新创建()。

代码语言:javascript
运行
复制
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()

onPause?但我的活动是可见的,我做错了什么?正确的状态不是onResume()吗?

现在,如果我切换到另一个应用程序,我就会得到错误。

谢谢你抽出时间为我糟糕的英语道歉。

此时,我不明白像文件管理器HD这样的应用程序是如何执行此操作的。

两项活动:主要活动A,以PreferenceFragment为主要内容的活动B。

在Holo和Holo.Light之间改变主题的一个选项是,活动B用PreferenceFragment中的OnSharedPreferenceChangeListener方法进行更改,但是当我们回到onResume()的主要活动recreate()方法失败时,如何做到这一点?

我很困惑。抱歉的。

EN

回答 3

Stack Overflow用户

发布于 2013-06-07 22:56:06

要做到这一点,请使用处理程序:

代码语言:javascript
运行
复制
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);
    }
}

这不会再崩溃了。

票数 3
EN

Stack Overflow用户

发布于 2011-11-10 21:45:23

我不知道这是否是导致您的问题的原因,但是您不能用Java来比较这样的String;

代码语言:javascript
运行
复制
protected void onResume() {
    ...
    if (recreate == "S") {
        recreate = "N";
        recreate();
    }

使用if ("S".equals(recreate))代替。

票数 0
EN

Stack Overflow用户

发布于 2011-11-10 21:59:37

你不应该单独打电话给onPause onCreate onResume等人。你不应该使用recreate()来做你想做的事情,如果它需要更新的话,把初始化代码放在其他地方。此外,使用整数来存储程序的状态,而不是字符串,然后声明一些最终变量来引用。

代码语言:javascript
运行
复制
public final int RECREATE_ON = 1;
public final int RECREATE_OFF = 2;
private int recreate = RECREATE_OFF;

...

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

请记住recreate()正在做什么:

导致使用新实例重新创建此活动。这在本质上与由于配置更改而创建活动时的流程相同--当前的实例将贯穿其生命周期,直到onDestroy(),以及随后创建的一个新实例。

这就是为什么您要获得onPause消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8086697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档