【转】 Pro Android学习笔记(九六):AsyncTask(5):横竖屏切换问题
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/
横竖屏切换的问题
在设备转动,进行横竖屏切换时,Activity是被destroy掉,新的acitivity会被re-create。但是worker线程仍然在进行,而在AsyncTask中的本地参数所记录的context已经失效,如果仍在这个context上执行相关的UI操作,就有很可能出现问题。
Android系统在切换方面已经做得相关智能,例如一些固有的view,例如前面小例子中的Textview,仍可继续显示信息,只是从用户体验上看,之前的内容被情况了。但是在集成AsyncTask中在通过Activity的context生成的ProgressDialog和Toast就无法做到智能。切换后,如果Activity还被其他的引用,并报告异常。原来生成的progressDialog在切换后由于Activity的context已经无效,被垃圾回收,将无法正常显示。

在切换后,如果执行progressDialog.cancel会报告严重异常,App退出:

在切换后,如果通过原来context,生成Toast,同样也会退出:

WeakReference
我们需要worker线程和activity的指针之间的松耦合,当activity重新建立时,它需要通知后台线程新的指针,或者后台线程需要知道activity已经失效,它需要一个新指针。前者实现的方式很多,,横竖屏切换会触发Activity的onDestroy,onRestart等回调函数,可以进行相应的处理,传递相关对象参考。对于后者,可以利用Java的WeakReference。
采用WeakReference的好处是允许系统进行垃圾回收,当垃圾回收时,即System.gc()时,通过get()获取的对象为null,以此提醒相关的对象已被垃圾回收,不能再正常使用。是下面是例子:
public class WeakPointTask extends AsyncTask{
……
private class A{
IReportBack report = null;
Context context = null;
A(IReportBack inr,Context cont){
report = inr;
context = cont;
}
}
WeakReference<IReportBack> weakI = null; //用于对照试验
WeakReference<A> weakA = null;
public WeakPointTask(IReportBack inr, Context inCont, String inTag){
tag = inTag;
weakA = new WeakReference<A> (new A(inr,inCont));
weakI = new WeakReference<IReportBack>(inr); //这种方式属于强引用,即使横竖屏切换后垃圾回收,仍会保留原来的参考指针, 即被会为null,我们会在logCat中观察。
}
@Override
protected void onProgressUpdate(Integer... values) {
Integer i = values[0];
A a = weakA.get();
Log.v("Task","A = " + a + " I = " + weakI.get());
if(a != null)
a.report.reportBack(tag, "Progress: i = " + i);
else
Log.v("Weak", "report interface is null");
}
}
相关的Log如下:

相关小例子源代码可在Pro Android学习:AsyncTask小例子中下载。
相关链接: 我的Android开发相关文章
【转】 Pro Android学习笔记(九六):AsyncTask(5):横竖屏切换问题的更多相关文章
- Pro Android学习笔记 ActionBar(1):Home图标区
Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode
目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式
可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单
目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...
- 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单
目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...
随机推荐
- C语言之非常简单的几道题
C语言之非常简单的几道题(还是写写),比较简单吧,主要有几道题的数据类型(如,第三题)和语句顺序(如,第二题)需要注意一小下下. 1. 求表达式S=1*2*3……*N的值大于150时,最小的N的值 / ...
- 关于Jupyter Notebook默认起始目录设置无效的解决方法
一.问题描述 今天折腾jupyter的时候,突然觉得起始目录是用户根目录很麻烦,想着把他改成自己的某个文件,按照网上方法折腾半天也还是无效.东点点西看看才发现端倪. [win10以下好像没这个问题,修 ...
- D3.js学习笔记(四)—— 使用SVG坐标空间
目标 在这一章,你将要使用D3.js基于一些数据把SVG元素添加到你想要的坐标位置上. 我们的目标就是使用下面的数据集: var spaceCircles = [30,70,110]; 并使用D3.j ...
- socket 关于同一条TCP链接数据包到达顺序的问题
转:http://blog.csdn.net/l1008610/article/details/52197602 以前作者也一直以为数据包先发的不一定先到,直到今天才意识这个问题的缺陷,数据包是不一定 ...
- react-quill 富文本编辑器
适合react的一款轻量级富文本编辑器 1.http://blog.csdn.net/xiaoxiao23333/article/details/62055128 (推荐一款Markdown富文本编辑 ...
- 简短的perl程序
简短的perl程序能够实现大功能. perl是如何做到的呢? 1. 默认变量 如果没有向函数提供参数值,则默认参数为$_: 如果没有变量用于接收一个表达式的值,则默认接收变量为 ...
- CocoaPods使用事项
本人整理转载自 :Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 1CocoaPods是什么? 当你 ...
- 任务调度 Spring Task 4(一)
深入浅出spring task定时任务 在工作中有用到spring task作为定时任务的处理,spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提 ...
- Maven入门:Maven的基本概念
本文转自:http://www.tianmaying.com/tutorial/maven-basic 看这篇文章之前,你应该先Run起来一个简单的Maven项目,先有个感性认识,然后再来听听对这些基 ...
- 《Drools7.0.0.Final规则引擎教程》之Springboot集成
本来准备按部就班的一章一章更新Drools相关教程,怎奈QQ群组(593177274)有朋友急需Springboot与Drools的集成demo,于是抽出时间写了一个,现在拿出来分享一下.加入群组可免 ...