Moja aplikacja ulegnie awarii, gdy przełączę fragmenty. Mam główny fragment z czatem. Kiedy przełączam fragmenty za pomocą bottomNavigationBar i wracam do głównego fragmentu czatu, moja aplikacja się zawiesza
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.
To jest moja klasa adapterów
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");
}
Oto moja metoda pobierania danych dla klasy adaptera
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) {
}
});
1 odpowiedź
Wygląda na to, że przekazujesz referencję do Fragment
do repozytorium za pośrednictwem anonimowego MyFirebaseCallBack
. Jeśli onDataChange()
w repozytorium uruchomi się, wywołany zostanie MyFirebaseCallback.onSuccessCallback()
. Ponieważ Fragment
instancja, dla której wykonywana jest następująca linia
chatAdapter = new ChatAdapter(getContext(), object, activityName, cityName);
Nie jest już dołączony do żadnego Activity
, jego getContext()
zwraca null
.
Z (anty-)wzorcem przekazywania wywołania zwrotnego do metoda ViewModel
, to do Ciebie należy sprawdzenie, czy getContext()
zwraca null
. Jeśli tak, nie powinieneś modyfikować niczego związanego z View
. Należy również pamiętać, że odłączona instancja Fragment
może już nigdy nie zostać dołączona do Activity
.
Zamiast tego możesz skorzystać z faktu, że ViewModel
uwzględnia cykl życia. Niech getMainChatByRoom(cityName, activityName)
zwróci LiveData<List<ChatModel>>
i zarejestruje Observer<List<ChatModel>>
w Fragment.onActivityCreated()
w ten sposób:
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 prawdopodobnie wymieni większość tego na wyrażenie lambda, ale chciałem pokazać, jak skonfigurowany jest Observer
)
Zobacz także przewodniki po architekturze aplikacji na Androida, zwłaszcza Obserwuj obiekty LiveData
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].