繁体   English   中英

未调用 LiveData 观察者

[英]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 有几种方法可以解决您的问题。

  1. 您可以在删除歌曲时简单地更新该MutableLiveData 因此,您可以通过再次执行GetPlaylistSongs任务从 repo 重新加载所有歌曲。
  2. 您可以手动将其从列表中删除,然后通知MutableLiveData
  3. 您可以更改您的 Dao 以实际公开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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM