我的应用中有一些链接。它会像这样开始可浏览的意图:
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
我知道这个例外的原因。但是如何解决呢?后台任务可以继续运行会更好。但是,暂停它们也是可以接受的。
答案 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更新。