亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

顯示空指針 expn 的 Android 片段中的 Toast

顯示空指針 expn 的 Android 片段中的 Toast

呼喚遠方 2021-09-15 14:42:46
我在嘗試在片段內顯示吐司的少數設備上遇到錯誤。這種吐司通常是在改造響應失敗。toast 代碼很簡單。請提出建議,在這里和那里搜索找不到任何理由。Toast.makeText(getActivity(), "Connection Failure", Toast.LENGTH_LONG).show();我的 ST 日志如下。Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference   at android.widget.Toast.(Toast.java:103)   at android.widget.Toast.makeText(Toast.java:256)
查看完整描述

3 回答

?
Cats萌萌

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);

   }

}


查看完整回答
反對 回復 2021-09-15
?
湖上湖

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消息。


查看完整回答
反對 回復 2021-09-15
  • 3 回答
  • 0 關注
  • 193 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號