3 回答

TA貢獻1805條經驗 獲得超9個贊
有時,當片段未與活動關聯時,getActivity() 或 getContext() 可能會產生空指針異常。所以使用 onAttach 方法
public class yourFragment extends Fragment {
Context context
@Override
public void onAttach(Context context) {
this.context = context;
super.onAttach(context);
}
}

TA貢獻2003條經驗 獲得超2個贊
根據代碼和 javadocFragment.getActivity()可以null返回:
/**
* Return the {@link FragmentActivity} this fragment is currently associated with.
* May return {@code null} if the fragment is associated with a {@link Context}
* instead.
*
* @see #requireActivity()
*/
@Nullable
final public FragmentActivity getActivity() {
return mHost == null ? null : (FragmentActivity) mHost.getActivity();
}
特別是當您的 Fragment 未附加到活動時(如此處和此處所指出的),可能會發生這種情況。
同樣,getContext()也可以返回null。
在這篇可能相關的帖子中,對這些何時可以為空進行了很好的討論:
為什么片段中的 getContext() 有時會返回 null?
已經提供了簡單的解決方案- 在顯示Toast.
但潛在的問題是架構之一 - 您的代碼將 API 活動耦合到您的 UI,并假設有關您的 UI 狀態的某些事情,即您假設當 API 調用返回時,您的屏幕仍然對用戶可見。
更好的解決方案是將 Retrofit 調用與 UI 分離——將 API 調用放在不依賴于 UI 狀態的單獨類中。
使用事件或發布-訂閱框架從這個 API 包裝類返回到任何需要知道 API 調用何時返回的 UI 組件。
EventBus或者RxJava將是 2 個常見的解決方案(LocalBroadcastManager將是一種不太常見的方法)。
這將允許任何代碼調用您的 API,并在 API 返回時訂閱通知。
它還允許您將 API 響應保存在(例如)本地數據庫中,在這種情況下,您可以只依賴該LiveData模式來更新任何需要的 UI。
這是一篇 Medium 文章,簡要描述了如何使用Repository模式以這種方式使用 Android 架構組件。
鑒于某些項目無法立即重新設計,因此可能需要變通方法。
上面提到的空檢查解決方法很有用,因為應用程序將不再崩潰。不幸的是,這確實意味著用戶不會收到 API 調用失敗的警報。
一種替代方法是創建您自己的Application子類(許多項目已經這樣做了以初始化公共庫)并提供一種靜態訪問此應用程序的方法Context。(Kushal 隨后也提出了類似的建議。)
然后,您可以選擇顯示Toast使用應用程序Context而不是片段中的應用程序。您可能會丟失從更具體的上下文中獲得的任何特定樣式,但好處是您的用戶仍然可以看到Toast消息。
添加回答
舉報