如何在没有&#34的情况下打开另一个应用程序;在onSaveInstanceState"之后无法执行此操作

时间:2014-08-30 15:05:59

标签: android

我的应用中有一些链接。它会像这样开始可浏览的意图:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(link));
startActivity(intent);

然后它会打开一个浏览器。与此同时,某些东西在后台运行,需要更新UI。所以我明白了:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 我知道这个例外的原因。但是如何解决呢?后台任务可以继续运行会更好。但是,暂停它们也是可以接受的。

3 个答案:

答案 0 :(得分:0)

如果UI对用户不可见,您为什么要这样做? 反正

从后台任务更新UI尝试runonUiThread

    getActivity().runOnUiThread(new  Runnable() { 
        public  void  run() { 
            //access UI here
        } 
    }); 

http://android.okhelp.cz/java_android_code.php?s=runOnUiThread

答案 1 :(得分:0)

在用于更新UI的回调中,检查活动是暂停还是停止,并且不执行UI更新逻辑。您可以使用在onResume()中设置为true的标志isForeground,在onStop()中使用false。

或者,我发现如果在提交片段事务时使用commitAllowingStateLoss,则可以避免异常。

答案 2 :(得分:0)

如果您使用的是AsyncTask,那么您真的不需要runOnUiThread()方法。 AsyncTask为您提供所需的一切。它封装了两个方法:preExecute()postExecute(),它们在主线程上运行,因此您可以更新这些方法中的UI组件。即使您需要逐步更新UI AsyncTask处理onProgressUpdate()方法中的那个再次在主线程上运行的方法。这样你的代码就比插入更清晰了:

getActivity().runOnUiThread(new  Runnable() { 
    public  void  run() { 
    } 
});

您甚至可以取消正在进行的任务:asyncTask.cancel(),例如您的活动onPause()方法,以避免在活动不可见时进行任何不必要的UI更新。