文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处: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
咱们须要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开发相关文章