2012-12-19 48 views
1

這裏的情景:的Android的AsyncTask回報屏幕旋轉後解僱一個ProgressDialog

  • 帳戶登錄頁
  • 點擊「登錄」觸發登錄的AsyncTask
  • 要在網絡接入阻止用戶界面,一個ProgressDialog彈出
  • 在返回時,ProgressDialog被駁回,用戶轉發

釷流程工作得很好。

這裏的問題:

  • 同時的AsyncTask是記錄他/她在

目前用戶可以旋轉屏幕,該ProgressDialog是由類字段引用,並使用該革職指針並調用.dismiss()。

如果屏幕旋轉,但是,一切都崩潰。

可能因爲活動被重新創建?我懷疑是圍繞該字段引用的閉包指向一個無法訪問的對象。你需要什麼?

我該如何可靠和優雅地解決它?只需添加if (... != null)支票?

更一般地,我必須承認,我不明白的「最佳實踐」的情況下適用這樣的:

  • 活動A觸發的AsyncTask
  • 用戶從活動A導航離開(後退按鈕?旋轉屏幕?onClick啓動一個意圖?)
  • 當活動A不是最上面的一個時,AsyncTask返回它的onPostExecute()具有UI效果,注意:原始代表觀察者不再可用。

  • 困惑*(注:我是一個初學者,所以一個完整的解釋會幫助我很多)

回答

1

是在改變方向,該活動被銷燬然後再重新創建它。
當運行時發生配置更改時,該活動將被關閉並在默認情況下重新啓動,但使用此屬性聲明配置將會阻止活動重新啓動。相反,該活動仍在運行,並調用onConfigurationChanged()方法。
此行android:configChanges="orientation|keyboardHidden"添加到您的清單文件

<activity 
    android:name="" 
    android:label="" 
    android:configChanges="orientation|keyboardHidden" /> 
+0

請解釋這對我的情況有何幫助。 – Robottinosino

+0

這可能有效,但推理是錯誤的。 'android:configChanges'指定'Activity'通過onConfigurationChanged()來處理自己的配置更改。請參閱[android文檔](http://developer.android.com/guide/topics/manifest/activity-element.html),包括本說明 - 「注意:使用此屬性應避免使用,請閱讀處理運行時更改,以獲取有關如何正確處理由於配置更改而導致的重新啓動的更多信息。「 – iagreen

+0

@iagreen,感謝您的糾正。將嘗試根據您的信息編輯推理。謝謝 –

0

我建議在看Handling Runtime Changes。有關可用方法的詳細信息的詳細說明。

android:configChanges="orientation..." tells android your application will take care of resizing the current view hierarchy. As such, when you specify that in your manifest, your activity will not be destroyed and recreated, instead the system will just call your activity's `onConfigurationChanged()` method. As it so happens, most of the stock widgets will resize themselves when their container changes, so if you are using basic layouts, this usually "just works" by redrawing the view hierarchy in the new format. For custom widgets, this trick may not work. 

批准的方法是保存一些配置實例的信息,當你在onSaveInstanceState()方法被破壞,然後在onCreate()

在你的情況下重新創建您的狀態,在對話框關閉時,然後屏幕切換方向,所以你可以這樣離開,或在你的onCreate()重新打開它。

+0

好。你知道如何處理從AsyncTask的回調,當「其他事物」將注意力從AsyncTask中的「.execute()'活動放在第一位?無可否認,這是一個比標題更普遍的問題.. – Robottinosino