为什么不能用viewmodel作为LifecycleOwner观察数据?
Why cant I observe data with viewmodel as LifecycleOwner?
我在我的 ViewModel
中使用 AsyncTask
加载我的数据,但是当我尝试观察我的片段中的数据时,我得到了异常:
原因:java.lang.ClassCastException:MainFragment 无法转换为 android.arch.lifecycle.LifecycleOwner
这是我的 ViewModel:
private MutableLiveData<ArrayList<Song>> songs;
public LiveData<ArrayList<Song>> getSongs() {
if (songs == null) {
songs = new MutableLiveData<ArrayList<Song>>();
loadSongs();
}
return songs;
}
@SuppressLint("StaticFieldLeak")
private void loadSongs() {
new AsyncTask<Void, Void, ArrayList<Song>>() {
@Override
protected ArrayList<Song> doInBackground(Void... voids) {
ArrayList<Song> data = new ArrayList<>();
//Add songs (collapsed)
return data;
}
@Override
protected void onPostExecute(ArrayList<Song> data) {
songs.postValue(data);
}
}.execute();
}
这是我的片段,我希望我的列表视图中包含我的数据:
viewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
//TODO: Fix this!
viewModel.getSongs().observe((LifecycleOwner) this, new Observer<ArrayList<Song>>() {
@Override
public void onChanged(@Nullable ArrayList<Song> songs) {
adapter = new ListViewAdapter(R.layout.songlist_customlayout, viewModel.getSongs().getValue(), getActivity());
}
});
这里有什么问题?
我遇到了,这是依赖的问题,尝试使用这个
implementation 'com.android.support:appcompat-v7:27.1.1'
或其他实现生命周期的 appCompact 依赖项。
AsynkTask 也很旧,使用 workManager 或 Coroutines 进行后台工作。
希望对你有所帮助
我通过将项目迁移到 androidx
修复了 ClassCastException
。
现在我不再收到错误:)
我在我的 ViewModel
中使用 AsyncTask
加载我的数据,但是当我尝试观察我的片段中的数据时,我得到了异常:
原因:java.lang.ClassCastException:MainFragment 无法转换为 android.arch.lifecycle.LifecycleOwner
这是我的 ViewModel:
private MutableLiveData<ArrayList<Song>> songs;
public LiveData<ArrayList<Song>> getSongs() {
if (songs == null) {
songs = new MutableLiveData<ArrayList<Song>>();
loadSongs();
}
return songs;
}
@SuppressLint("StaticFieldLeak")
private void loadSongs() {
new AsyncTask<Void, Void, ArrayList<Song>>() {
@Override
protected ArrayList<Song> doInBackground(Void... voids) {
ArrayList<Song> data = new ArrayList<>();
//Add songs (collapsed)
return data;
}
@Override
protected void onPostExecute(ArrayList<Song> data) {
songs.postValue(data);
}
}.execute();
}
这是我的片段,我希望我的列表视图中包含我的数据:
viewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
//TODO: Fix this!
viewModel.getSongs().observe((LifecycleOwner) this, new Observer<ArrayList<Song>>() {
@Override
public void onChanged(@Nullable ArrayList<Song> songs) {
adapter = new ListViewAdapter(R.layout.songlist_customlayout, viewModel.getSongs().getValue(), getActivity());
}
});
这里有什么问题?
我遇到了,这是依赖的问题,尝试使用这个
implementation 'com.android.support:appcompat-v7:27.1.1'
或其他实现生命周期的 appCompact 依赖项。 AsynkTask 也很旧,使用 workManager 或 Coroutines 进行后台工作。 希望对你有所帮助
我通过将项目迁移到 androidx
修复了 ClassCastException
。
现在我不再收到错误:)