[英]LiveData observer not get called
ViewModel、Repository 和 Dao 类在下面提到。
在 Fragment 中实例化 Viewmodel。
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;
}
}}
存储库:
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);
}}
道:
@Dao
public interface PlaylistSongDao {
@Query("SELECT * FROM " + PlaylistVideoConstants.TABLE_NAME +
" WHERE " + PlaylistVideoConstants.Columns.PLAYLIST_ID + " = :playlistId")
List<PlaylistSong> getAllPlaylistSongs(String playlistId);
@Query("DELETE FROM "+ PlaylistVideoConstants.TABLE_NAME + " WHERE " + PlaylistVideoConstants.Columns.PATH + " = :path")
void delete(String path);}
现在的问题是每当我要删除任何数据时。 我的观察者没有收到任何回调。
如果我做错了什么,请纠正。
我假设您正在观察allPlaylistSongs
。 当您按路径删除时,您永远不会更新该MutableLiveData
。 有几种方法可以解决您的问题。
MutableLiveData
。 因此,您可以通过再次执行GetPlaylistSongs
任务从 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);}
通过将其更改为LiveData
您现在可以删除GetPlaylistSongs
任务,您可以直接将LiveData
对象传递给 Repository,然后传递给 Fragment(当然应用您可能需要的任何转换)。
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.