I'm trying to populate a recycler view and fetching data from the server, but the app is crashing and showing below error. I am unable to get where actually error is:
2021-02-15 13:28:02.425 21513-21513/com.app.itunes E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.itunes, PID: 21513
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at c.b.a.h.b$a.b(:93)
at c.b.a.h.b$a.a(:76)
at androidx.lifecycle.LiveData.c(:133)
at androidx.lifecycle.LiveData.d(:151)
at androidx.lifecycle.LiveData.k(:309)
at b.m.p.k(:50)
at c.b.a.d.b$a.b(:50)
at f.h$b$a$a.run(:71)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Below is my code:
VideoRepository.java
public class VideoRepository {
Application application;
MutableLiveData<List<Result>> myVideos = new MutableLiveData<>();
List<Result> videos = new ArrayList<>();
public VideoRepository() {
this.application = application;
}
public MutableLiveData<List<Result>> getMyVideos() {
Retrofit retrofit = RetrofitClient.getInstance();
ApiService apiService = retrofit.create(ApiService.class);
Call<Video> videoList = apiService.getTracks("Michael+jackson", "musicVideo");
videoList.enqueue(new Callback<Video>() {
@Override
public void onResponse(Call<Video> call, Response<Video> response) {
Video video = (Video) response.body();
if(response.body() != null){
videos = video.getResults();
myVideos.setValue(videos);
}
}
@Override
public void onFailure(Call<Video> call, Throwable t) {
Toast.makeText(application,t.getMessage(),Toast.LENGTH_SHORT).show();
}
});
return myVideos;
}
}
VideoViewModel.java
public class VideoViewModel extends ViewModel {
VideoRepository videoRepository;
public VideoViewModel(){
videoRepository = new VideoRepository();
}
public LiveData<List<Result>> getVideoRepository() {
return videoRepository.getMyVideos();
}
}
VideoFragment.java
private void loadTracks(){
fragmentVideoBinding.videoRecycler.setHasFixedSize(true);
fragmentVideoBinding.videoRecycler.setLayoutManager(new GridLayoutManager(getActivity(),2,GridLayoutManager.VERTICAL, false));
videoViewModel = new ViewModelProvider(getActivity()).get(VideoViewModel.class);
videoViewModel.getVideoRepository().observe(getActivity(), new Observer<List<Result>>() {
@Override
public void onChanged(List<Result> results) {
if(results.size() > 0){
fragmentVideoBinding.animEmpty.setVisibility(View.INVISIBLE);
videoList = results;
VideoAdapter adapter = new VideoAdapter(videoList,getActivity());
fragmentVideoBinding.videoRecycler.setItemAnimator(new DefaultItemAnimator());
fragmentVideoBinding.videoRecycler.setAdapter(adapter);
}
else{
fragmentVideoBinding.animEmpty.setVisibility(View.INVISIBLE);
Toast.makeText(getActivity(), "Nothing to show", Toast.LENGTH_SHORT).show();
}
}
});
}
Why is my app crashing?