文章轉載只能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處: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開發相關文章