【转】 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等参数 什 ...
随机推荐
- echarts3结合openlayers2实现Map类型图表
网上查阅了部分资料,有些是用echarts2实现的,因echarts2无法满足项目中其他部分的要求,故只能采用echarts3(2017/9/18,echarts3官网突然把基于geo的demo下架了 ...
- response.setHeader()用法
response.setHeader()下载中文文件名乱码问题 收藏 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data ...
- FMDB官方使用文档 G-C-D的使用 提高性能(翻译)
由于FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍.与此同时,把SQLite的文档页 加到你的书签中.自动引用计数(APC)还是手动内存管理呢? 两种都行,FMDB会 ...
- [eShopOnContainers 学习系列] - 00 - 开发环境需求
开发环境需求 https://github.com/dotnet-architecture/eShopOnContainers/wiki/00.-Dev-machine-requirements 我的 ...
- Ubuntu下Python使用MySQLdb远程连接数据库的常见问题及解决方案
本文基于http://www.cnblogs.com/fnng/p/3565912.html这篇博文,学习使用MySQLdb过程中遇到下面这些问题. 1. 安装MySQLdb时运行sudo pytho ...
- Centos6.8 Jetty 安装配置
ssh root@IP Password------------------------------------------------------------------------------↑登 ...
- 解析XML文件的几种方式及其比较
解析xml文件目前比较流行的主要有四种方式: 1. DOM(Document Object Model)它把整个XML文档当成一个对象加载到内 存,不管文档有多大.它一般处理小文件 2.SAX(Si ...
- [转]页游开发中的 Python 组件与模式Presentation Transcript
转: 页游开发中的 Python 组件与模式Presentation Transcript 1. 页游开发中的 Python 组件与模式 赖勇浩( http://laiyonghao.com ) 20 ...
- RPi 2B QEMU 模拟树莓派
/******************************************************************************** * RPi 2B QEMU 模拟树莓 ...
- Oracle新用户以及授权的若干问题
Database 实验4 问题: 授权语句 grant create table to user_name; 收回授权语句 revoke create table from user_name; 注意 ...