Android 未调用LiveData观察程序
ViewModel、Repository和Dao类如下所述 在片段中实例化ViewmodelAndroid 未调用LiveData观察程序,android,android-architecture-components,android-livedata,Android,Android Architecture Components,Android Livedata,ViewModel、Repository和Dao类如下所述 在片段中实例化Viewmodel playlistVideoViewModel = ViewModelProviders.of(this).get(PlaylistVideoViewModel.class); playlistVideoViewModel.getAllPlaylistVideos(String.valueOf(currentBucketId)).observe(this, new PlaylistSongObserver
playlistVideoViewModel = ViewModelProviders.of(this).get(PlaylistVideoViewModel.class);
playlistVideoViewModel.getAllPlaylistVideos(String.valueOf(currentBucketId)).observe(this, new PlaylistSongObserver());
查看模型类:
public class PlaylistVideoViewModel extends AndroidViewModel {
private MutableLiveData<List<PlaylistSong>> allPlaylistSongs;
private PlaylistVideoRepo playlistVideoRepo;
public PlaylistVideoViewModel(@NonNull Application application) {
super(application);
playlistVideoRepo = new PlaylistVideoRepo(application);
allPlaylistSongs = new MutableLiveData<>();
}
public LiveData<List<PlaylistSong>> getAllPlaylistVideos(String playlistId) {
new GetPlaylistSongs().execute(playlistId);
return allPlaylistSongs;
}
public void delete(String path) {
playlistVideoRepo.delete(path);
}
@SuppressLint("StaticFieldLeak")
class GetPlaylistSongs extends AsyncTask<String, Void, Void>{
@Override
protected Void doInBackground(String... strings) {
allPlaylistSongs.postValue(playlistVideoRepo.getAllPlaylistSongs(strings[0]));
return null;
}
}}
公共类播放列表VideoViewModel扩展了AndroidViewModel{
私有可变LiveData所有播放歌曲;
私人播放;录像播放;录像播放;
公共播放列表VideoViewModel(@NonNull应用程序){
超级(应用);
PlayVideoRepo=新的PlayVideoRepo(应用程序);
AllPlaySongs=新的可变LiveData();
}
public LiveData GetAllPlayVideos(字符串播放ID){
新建GetPlaySongs().execute(播放ID);
返回所有播放的歌曲;
}
公共无效删除(字符串路径){
播放视频复制删除(路径);
}
@SuppressLint(“StaticFieldLeak”)
类GetPlaylist扩展异步任务{
@凌驾
受保护的Void doInBackground(字符串…字符串){
AllPlaySongs.postValue(PlayVideoRepo.GetAllPlaySongs(字符串[0]);
返回null;
}
}}
存储库:
class PlaylistVideoRepo {
private final PlaylistSongDao playlistSongDao;
PlaylistVideoRepo(Application application) {
AppDatabase appDatabase = AppDatabase.getDatabase(application);
playlistSongDao = appDatabase.playlistSongDao();
}
public List<PlaylistSong> getAllPlaylistSongs(String playlistId) {
return playlistSongDao.getAllPlaylistSongs(playlistId);
}
public void delete(String path) {
new DeletePlaylistVideoAsyncTask(playlistSongDao).execute(path);
}}
类播放列表VideoRepo{
私人最终播放列表松岛播放列表松岛;
播放视频报告(应用程序){
AppDatabase AppDatabase=AppDatabase.getDatabase(应用程序);
playlishongdao=appDatabase.playlishongdao();
}
公共列表GetAllPlaySongs(字符串播放ID){
返回playlistongdao.getallplaylistongs(playlistId);
}
公共无效删除(字符串路径){
新建deletePlayVideoAsyncTask(PlaySongdao)。执行(路径);
}}
道:
@Dao
公共接口{
@查询(“选择*自”+playliveconstants.TABLE\u名称+
其中“+playliveconstants.Columns.PLAYLIST_ID+”=:playlistId”)
列出GetAllPlaySongs(字符串播放ID);
@查询(“从“+PlayVideoConstants.TABLE_NAME+”中删除,其中“+PlayVideoConstants.Columns.PATH+”=:PATH”)
无效删除(字符串路径);}
现在的问题是每当我要删除任何数据时。我的观察者没有收到任何回调
如果我做错了什么,请纠正 我假设您正在观察
所有播放歌曲
。当您按路径删除时,您永远不会更新该MutableLiveData
。有几种方法可以解决你的问题
MutableLiveData
。因此,您可以通过再次执行getplaylistoks
任务从repo重新加载所有歌曲MutableLiveData
LiveData
,而不仅仅是值。这样,数据库中的任何更改都将传播给您的观察者@Dao
public interface PlaylistSongDao {
@Query("SELECT * FROM " + PlaylistVideoConstants.TABLE_NAME +
" WHERE " + PlaylistVideoConstants.Columns.PLAYLIST_ID + " = :playlistId")
LiveData<List<PlaylistSong>> getAllPlaylistSongs(String playlistId);
@Query("DELETE FROM "+ PlaylistVideoConstants.TABLE_NAME + " WHERE " + PlaylistVideoConstants.Columns.PATH + " = :path")
void delete(String path);}
@Dao
公共接口{
@查询(“选择*自”+playliveconstants.TABLE\u名称+
其中“+playliveconstants.Columns.PLAYLIST_ID+”=:playlistId”)
LiveData GetAllPlaySongs(字符串播放ID);
@查询(“从“+PlayVideoConstants.TABLE_NAME+”中删除,其中“+PlayVideoConstants.Columns.PATH+”=:PATH”)
无效删除(字符串路径);}
通过将其更改为LiveData
,您现在可以删除getplaylishongs
任务,您可以直接将LiveData
对象传递到存储库,然后再传递到片段(当然可以应用您可能需要的任何转换)
我希望这能有所帮助。我同意你的第一点。回答你的第三点。在使用MutableLiveData之前,我使用从DAO返回的LiveData进行观察。但也有同样的问题,这就是为什么我选择了MutableLiveData。你找到解决方案了吗?我也在想同样的事情。
@Dao
public interface PlaylistSongDao {
@Query("SELECT * FROM " + PlaylistVideoConstants.TABLE_NAME +
" WHERE " + PlaylistVideoConstants.Columns.PLAYLIST_ID + " = :playlistId")
LiveData<List<PlaylistSong>> getAllPlaylistSongs(String playlistId);
@Query("DELETE FROM "+ PlaylistVideoConstants.TABLE_NAME + " WHERE " + PlaylistVideoConstants.Columns.PATH + " = :path")
void delete(String path);}