【发布时间】:2021-05-17 07:13:46
【问题描述】:
我创建了视图模型和存储库,在构造函数中我将 application 上下文作为参数传递给视图模型和存储库类,但它显示错误并且应用程序崩溃。
下面是我的堆栈跟踪:
2021-02-14 03:24:20.782 8516-8516/com.app.itunes E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.itunes, PID: 8516
java.lang.RuntimeException: Cannot create an instance of class com.app.itunes.ViewModels.HistoryViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
at com.app.itunes.fragments.HistoryFragment.onCreateView(HistoryFragment.java:38)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
Caused by: java.lang.InstantiationException: java.lang.Class<com.app.itunes.ViewModels.HistoryViewModel> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
下面是我的代码:
HistoryViewModel.java
public class HistoryViewModel extends ViewModel {
public HistoryRepository historyRepository;
public LiveData<List<Tracks>> allTracks;
public HistoryViewModel(Application application){
historyRepository = new HistoryRepository(application);
}
public LiveData<List<Tracks>> allTracks(){
return historyRepository.myTracks();
}
}
HistoryRepository.java
public class HistoryRepository {
public TrackDao trackDao;
public LiveData<List<Tracks>> allTracks;
public TrackDb db;
public HistoryRepository(Application application){
db = TrackDb.getInstance(application);
trackDao = db.trackDao();
allTracks = trackDao.getAllTracks();
}
public LiveData<List<Tracks>> myTracks(){
return allTracks;
}
}
HistoryFragment.java
private void loadHistory(){
historyViewModel = new ViewModelProvider(getActivity()).get(HistoryViewModel.class);
fragmentHistoryBinding.historyRecycler.setHasFixedSize(true);
fragmentHistoryBinding.historyRecycler.setLayoutManager(new GridLayoutManager(getActivity(),2,GridLayoutManager.VERTICAL, false));
historyViewModel.allTracks().observe(getActivity(), new Observer<List<Tracks>>() {
@Override
public void onChanged(List<Tracks> tracks) {
if(tracks.size() > 0){
HistoryAdapter adapter = new HistoryAdapter();
adapter.setTrackList(tracks);
}
else{
}
}
});
}
我可以尝试什么来解决这个问题?
【问题讨论】:
-
拥有
HistoryViewModel扩展AndroidViewModel,而不是ViewModel,我想你会有更好的运气。 -
我已将其更改为
AndroidViewModel,但仍然是同样的错误。 -
您能告诉我为什么我们使用
AndroidViewModel代替ViewModel。
标签: java android mvvm viewmodel