2017-06-23 153 views
0

我收到一條錯誤消息,說明在調用FragmentManager時活動已經被銷燬。是否存在FragmentManager在進行交易調用之前可以執行的檢查,或者是否需要獲取該活動並檢查它是否爲空或!activity.isFinishing()?我還需要做其他檢查嗎?這是我以前做的事,但不知道這仍然是做到這一點的方法嗎?只是好奇片段管理員爲什麼不知道活動的狀態......我需要涵蓋活動即將被銷燬的情況以及它已經被銷燬的情況()。無論哪種情況,我都不想承諾交易。Is(!activity.isFinishing())是否可以檢查該活動是否已被銷燬? isFinishing()與isDestoryed()

更新:對於API 17+ activity.isDestroyed()可用。對於API < 17仍然需要確認activity.isFinishing()是否會檢測到已銷燬的活動,或者是否有其他方法來執行此操作?

if ((activity != null) && !activity.isFinishing()) { 
     fm.FragmentTransaction fragmentTransaction = 
     fm.beginTransaction().replace(R.id.fragment_container, mFeedFragment).commitAllowingStatelessLoss(); 
    } 

回答

1

試試這個 布爾isDestroyed()

返回true如果最終的onDestroy()已經調用上的活動,所以現在這種情況已經死了。

以下是您在活動將變得不可見之前執行任何任務的方法。

  • onDestroy() - 活動isdestroyed
  • isFinishing之前執行任何最後的清理 - 檢查是否這項活動是在整理的過程中,
  • onStop -Called當活動不再對用戶可見。
  • onPause - 作爲活動生命週期的一部分,當活動進入後臺但尚未(尚未)中止時調用。
  • onBackPressed - 當活動檢測到用戶按下後退鍵時調用。默認實現只是完成當前活動,但您可以覆蓋它以執行任何您想要的操作。
+0

但是,這是必要的,如果isFinishing()也被稱爲()? – gitsensible

+0

@gitsensible檢查畝更新ans –

+0

我認爲isFinishing()可能會返回true,一旦它已被銷燬。你怎麼看? – gitsensible

0

最好的辦法是檢查是否Activity.isFinishing()。如果true,那麼與這樣的Activity一起工作是不安全的,如果false至少我們知道Activity的銷燬沒有被觸發。

推理

  • 檢查是否已Activitynull並不意味着Activity是 破壞。 Activity可能會被銷燬,並仍然保存在其中創建的數據 。
  • 察看如果最終的onDestroy()調用已對活動作出Activity.isDestroyed()docs狀態,

    返回true,那麼現在這種情況已經死了。

    什麼DEAD例如意味着IDK,我無法找出 互聯網上一個完整的答案,但顯然,這並不意味着在這種情況下null。 因此,dead instance != null

  • 察看Activity.isFinishing()docs狀態,

    檢查,看看是否這項活動是在整理的過程中,或者是因爲你叫光潔度()或其他人 要求它完成。這通常用於onPause()至 確定活動是簡單地暫停還是完全地完成 。

  • 調用Activity.finish()將調用Activity.onDestroy()。 然而,做一些測試與Robolectric的幫助後認爲,調用 Activity.finish()

    Activity.isFinishing() == true Activity.isDestroyed() == false

    後爲什麼,檢查what exactly Activity.finish() method is doing?

相關問題