目录(?)[-]

  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. NumPy Matplotlib库

    NumPy - Matplotlib Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案. 它也可以和图形工具包一起使用,如 ...

  2. ZC_RemoteThread

    1.Z_WinMain.cpp #include <windows.h> #include "resource.h" #include "Z_RemoteFu ...

  3. Red Hat OpenStack 10的新特性

    这是Red Hat有史以来最好的版本,同时也是第一个长生命周期版本(最长五年支持),这篇文章会介绍为什么这是你私有云最好的礼物. 由于要使用命令行,以前安装OpenStack是很繁重的工作.这个版本提 ...

  4. 在OpenStack里怎样配置Neutron,让虚拟机访问外网

    http://blog.csdn.net/zhangli_perdue/article/details/50264681 OpenStack里虚机(或者叫instance)只有在分配floating ...

  5. Spark- JdbcRDD以及注意事项

    先上Demo package com.rz.spark.base import java.sql.DriverManager import org.apache.spark.rdd.JdbcRDD i ...

  6. SpringBoot实现文件上传功能

    新建maven项目,pom文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...

  7. 7zip 自解压安装程序

    包含自解压安装器的包https://jaist.dl.sourceforge.net/project/sevenzip/7-Zip/9.20/7z920_extra.7z详细说明见7-zip帮助文档的 ...

  8. Xcode删除无用的Symbols信息

    open ~/Library/Developer/Xcode/iOS\ DeviceSupport 进入后对不需要的版本手动Delete.

  9. RedHat Linux服务器安全配置细节

    1.概述 Linux服务器版本:RedHat Linux AS 2.1 对于开放式的操作系统---Linux,系统的安全设定包括系统服务最小化.限制远程存取.隐藏重要资料.修补安全漏洞.采用安全工具以 ...

  10. 2017.11.7 Python 制作EFM32/ AVR批量烧录工具

    Customer need program quickly asap. ok,I need to set up a table for test. 1 reference data http://ww ...