设为首页 加入收藏

TOP

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案(二)
2015-08-31 21:25:00 来源: 作者: 【 】 浏览:76
Tags:Android 屏幕 旋转 处理 AsyncTask ProgressDialog 最佳 方案
据的存储,在onCreate中对数据进行恢复,免去了不必要的再加载一遍。


运行结果:


当正常加载数据完成之后,用户不断进行旋转屏幕,log会不断打出:onSaveInstanceState->onDestroy->onCreate->onRestoreInstanceState,验证我们的确是重新启动了,但是我们没有再次去进行数据加载。


如果在加载的时候,进行旋转,则会发生错误,异常退出(退出原因:dialog.dismiss()时发生NullPointException,因为与当前对话框绑定的FragmentManager为null,又有兴趣的可以去Debug,这个不是关键)。


效果图:



4、使用Fragment来保存对象,用于恢复数据


如果重新启动你的Activity需要恢复大量的数据,重新建立网络连接,或者执行其他的密集型操作,这样因为配置发生变化而完全重新启动可能会是一个慢的用户体验。并且,使用系统提供的onSaveIntanceState()的回调中,使用Bundle来完全恢复你Activity的状态是可能是不现实的(Bundle不是设计用来携带大量数据的(例如bitmap),并且Bundle中的数据必须能够被序列化和反序列化),这样会消耗大量的内存和导致配置变化缓慢。在这样的情况下,当你的Activity因为配置发生改变而重启,你可以通过保持一个Fragment来缓解重新启动带来的负担。这个Fragment可以包含你想要保持的有状态的对象的引用。


当Android系统因为配置变化关闭你的Activity的时候,你的Activity中被标识保持的fragments不会被销毁。你可以在你的Activity中添加这样的fragements来保存有状态的对象。


在运行时配置发生变化时,在Fragment中保存有状态的对象


a) 继承Fragment,声明引用指向你的有状态的对象


b) 当Fragment创建时调用setRetainInstance(boolean)


c) 把Fragment实例添加到Activity中


d) 当Activity重新启动后,使用FragmentManager对Fragment进行恢复


代码:


首先是Fragment:


package com.example.zhy_handle_runtime_change;


import android.app.Fragment;
import android.graphics.Bitmap;
import android.os.Bundle;


public class RetainedFragment extends Fragment
{
?// data object we want to retain
?private Bitmap data;
?// this method is only called once for this fragment
?@Override
?public void onCreate(Bundle savedInstanceState)
?{
? super.onCreate(savedInstanceState);
? // retain this fragment
? setRetainInstance(true);
?}


?public void setData(Bitmap data)
?{
? this.data = data;
?}


?public Bitmap getData()
?{
? return data;
?}
}


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android开发学习之Adapter(数据适.. 下一篇Android 官方推荐:DialogFragment..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: