目录(?)[-]

  1. 横竖屏切换的问题
  2. WeakReference

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处: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):横竖屏切换问题的更多相关文章

  1. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  2. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  3. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  4. 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

    目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...

  5. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  6. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  7. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  8. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  9. 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单

    目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...

  10. 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单

    目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...

随机推荐

  1. Autolayout .Compact or .Regular [iPhone/iPad]

  2. Java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换  Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调 ...

  3. js图片倒计时

    var discountOnline = !{discountOnline} if (discountOnline) { _fresh() setInterval(_fresh, 1000); } v ...

  4. mongodb集群——配置服务器放分片meta信息,说明meta里包含了哪些数据信息

    在搭建分片之前,先了解下分片中各个角色的作用. ① 配置服务器.是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息.最先开始建立,启用日志功能.像启动普通的mongod ...

  5. Mac下webpack安装

    最近开始接触构建工具webpack,公司电脑是 windows,而我自己的呢是mac.本来以为在自己电脑安装很简单,但是出了点问题,所以写出来分享下. 这里用npm的方式安装,首先你要安装node.j ...

  6. javascript: what can javascript do?

    1.Javascript can change html content <!DOCTYPE html> <html> <body> <h2>What ...

  7. Agilent RF fundamentals (2)- fundamental units of RF

    1Amplitude AM调制 2 Frequency FM调制 3Phase Phase 调制 复合调制 三者关系:

  8. DRF 用户频率限制

    DRF 用户频率限制 为什么要限流 1 防爬虫 匿名用户 无法限制,代理 已登录,用户名限制:买代理 2 提供服务(接口--不同用户的访问次数不一样) vip 限制访问次数 BaseThrottle ...

  9. [Scala]Scala学习笔记一 基础

    1. 变量 val定义的值实际上是一个常亮,无法改变其内容 scala> val num = 0 num: Int = 0 scala> num = 2 <console>:1 ...

  10. Leetcode 938. Range Sum of BST

    import functools # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, ...