簡體   English   中英

切換片段后Android應用程序崩潰

[英]Android app crash after switching fragments

當我切換片段時,我的應用程序會崩潰。 我有聊天的主要片段。 當我使用 bottomNavigationBar 切換片段並返回主聊天片段時,我的應用程序將崩潰

    Process: com.example.uwebeta1, PID: 11210
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.Application android.app.Activity.getApplication()' on a null object reference
        at androidx.lifecycle.ViewModelProviders.checkApplication(ViewModelProviders.java:42)
        at androidx.lifecycle.ViewModelProviders.of(ViewModelProviders.java:122)
        at androidx.lifecycle.ViewModelProviders.of(ViewModelProviders.java:85)
        at com.example.uwebeta1.Adapter.ChatAdapter.<init>(ChatAdapter.java:68)
        at com.example.uwebeta1.Views.Fragments.MainActivityFragments.MainMasterFragment$9.onSuccessCallback(MainMasterFragment.java:366)
        at com.example.uwebeta1.Views.Fragments.MainActivityFragments.MainMasterFragment$9.onSuccessCallback(MainMasterFragment.java:362)
        at com.example.uwebeta1.Repository.ChatsRepository$1.onDataChange(ChatsRepository.java:79)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.5:75)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.0.5:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.0.5:55)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7073)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
I/Process: Sending signal. PID: 11210 SIG: 9
Process 11210 terminated.

這是我的適配器類

  public ChatAdapter(Context mContext, List<ChatModel> mChat, String activityName, String city) {
        this.mChat = mChat;
        this.mContext = mContext;
        this.activityName = activityName;
        this.city = city;

        userViewModel = ViewModelProviders.of((FragmentActivity) mContext).get(UserViewModel.class);
        rootRef = FirebaseDatabase.getInstance().getReference().child("Users");
    }  

這是我獲取適配器類數據的方法

chatsViewModel.getMainChatByRoom(cityName, activityName, new MyFirebaseCallBack<List<ChatModel>>() {
                        @Override
                        public void onSuccessCallback(List<ChatModel> object) {

                            chatAdapter = new ChatAdapter(getContext(), object, activityName, cityName);
                            recycler_view.setAdapter(chatAdapter);
                        }

                        @Override
                        public void onFailureCallback(String message) {

                        }
                    });

看起來您通過匿名MyFirebaseCallBackFragment的引用傳遞到存儲庫中。 如果onDataChange()在倉庫火災, MyFirebaseCallback.onSuccessCallback()被調用。 由於執行以下行的Fragment實例

chatAdapter = new ChatAdapter(getContext(), object, activityName, cityName);

不再附加到任何Activity ,它的getContext()返回null

使用將回調傳遞到ViewModel方法的(反)模式,您可以檢查getContext()返回null 如果是,則不應修改與View相關的任何內容。 另請注意,分離的Fragment實例可能永遠不會再附加到Activity

相反,您可以利用ViewModel具有生命周期感知這一事實。 getMainChatByRoom(cityName, activityName)返回一個LiveData<List<ChatModel>>並在Fragment.onActivityCreated()注冊一個Observer<List<ChatModel>> ,如下所示:

chatsViewModel.getMainChatByRoom(cityName, activityName).observe(getViewLifecycleOwner(), new Observer<List<ChatModel>>(){
    @Override
    onChange(@Nullable List<ChatModel> data){
        chatAdapter = new ChatAdapter(getContext(), object, activityName, cityName);
        recycler_view.setAdapter(chatAdapter);
    }
}

(Android Studio 可能會將大部分內容交換為 lambda 表達式,但我想向您展示Observer是如何設置的)

另請參閱指南 android 應用程序架構,尤其是觀察 LiveData 對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM