我在應用程序中處理這個問題的方式是覆蓋活動的onRetainCustomNonConfigurationInstance()
方法,該方法允許您在屏幕旋轉時通過重新啓動來保留對象。以下是我如何實現它。
我有一個執行Web請求的AsyncTask。 AsyncTask在一個單獨的文件中,並且將對調用Activity的引用作爲我已經實現的一些回調的偵聽器。因此,對於我的Web請求的AsyncTask的構造是這樣的:
private Callbacks listener;
public WebRequest(Callbacks listener) {
this.listener = listener;
}
我實現onRetainCustomNonConfigurationInstance()
在我的活動是這樣的:
@Override
public Object onRetainCustomNonConfigurationInstance() {
if(webRequest != null) {
webRequest.detachFromActivity();
return webRequest;
} else {
return null;
}
}
現在,當我的屏幕旋轉時,活動重新啓動,如果我的AsyncTask正在運行,它會在這裏保存對它的引用。請注意,我也將「我的任務」從當前的「活動」中分離出來,該活動現在將被銷燬。我通過讓偵聽器(這是當前的Activity)爲空來實現我的任務。就像這樣:
public void detachFromActivity() {
listener = null;
}
現在,當活動重新啓動,在onCreate()
,我檢查,看看是否有一個保留提及我正在運行的線程調用getLastCustomNonConfigurationInstance()
這樣的:
Object retainedRequest = getLastCustomNonConfigurationInstance();
if(retainedRequest != null) {
if(retainedRequest instanceof WebRequest) {
webRequest = (WebRequest) retainedRequest;
webRequest.setListener(this);
}
}
由於參考我的運行線程作爲Object
傳遞,我需要將它作爲Object檢索,然後檢查它是否是我的AsyncTask的實例,然後如果是的話就進行轉換。
最後一步是將回調「重新連接」到剛剛創建的這個NEW活動,以便任務知道發送結果的位置。我用的是setListener(this)
方法來做到這一點在我的任務,像這樣:
public void setListener(Callbacks listener) {
this.listener = listener;
}
現在我可以參考重新連接到舊線與新重新創建活動。您可能沒有使用AsyncTask,但概念是相同的,並且應該適用於任何線程或任何您想要的對象。
希望這會有所幫助!
謝謝。第二個回覆中的博客文章(使用保留的片段)似乎正是我所需要的。 –