【转】 Pro Android学习笔记(九六):AsyncTask(5):横竖屏切换问题

目录(?)[-]ide

  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已经无效,被垃圾回收,将没法正常显示。.net

在切换后,若是执行progressDialog.cancel会报告严重异常,App退出:线程

在切换后,若是经过原来context,生成Toast,一样也会退出:3d

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"); 
    } 
blog

相关的Log以下:ci

相关小例子源代码可在Pro Android学习:AsyncTask小例子中下载。

相关连接: 个人Android开发相关文章

相关文章
相关标签/搜索