【问题标题】:Android app crash after switching fragments切换片段后Android应用程序崩溃
【发布时间】:2019-12-19 18:49:34
【问题描述】:

当我切换片段时,我的应用程序将崩溃。我有聊天的主要片段。当我使用 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) {

                        }
                    });

【问题讨论】:

    标签: java android firebase android-fragments


    【解决方案1】:

    看起来您通过匿名MyFirebaseCallBack 将对Fragment 的引用传递到存储库。如果存储库中的onDataChange() 触发,则调用MyFirebaseCallback.onSuccessCallback()。由于执行以下行的Fragmentinstance

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

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

    通过将回调传递给ViewModel 方法的(anti-)pattern,您可以检查getContext() 是否返回null。如果是这样,您不应修改与Views 相关的任何内容。另请注意,分离的Fragment 实例可能永远不会再附加到Activity

    相反,您可以利用ViewModel 可感知生命周期这一事实。 让getMainChatByRoom(cityName, activityName) 返回一个LiveData&lt;List&lt;ChatModel&gt;&gt; 并在Fragment.onActivityCreated() 中注册一个Observer&lt;List&lt;ChatModel&gt;&gt;,如下所示:

    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 应用架构指南,尤其是 Observe LiveData objects

    【讨论】:

      猜你喜欢
      • 2014-06-05
      • 2015-06-17
      • 2014-03-08
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 2020-02-29
      • 2016-11-09
      • 1970-01-01
      相关资源
      最近更新 更多