zoukankan      html  css  js  c++  java
  • 【转】 Pro Android学习笔记(九六):AsyncTask(5):横竖屏切换问题

    目录(?)[-]

    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开发相关文章

  • 相关阅读:
    Visual Studio 快捷键
    C#编程使用Managed Wifi API连接无线SSID
    C#两种创建快捷方式的方法
    COJ 1059
    [Unity3D]Unity3D游戏开发之鼠标滚轮实现放大缩小
    cloudstack4.4新增功能前瞻
    hdu 4635 Strongly connected (tarjan)
    freemarker声明变量
    Android 4.4 Kitkat Phone工作流程浅析(六)__InCallActivity显示更新流程
    评教,路上的风景更美
  • 原文地址:https://www.cnblogs.com/blongfree/p/5048109.html
Copyright © 2011-2022 走看看