【问题标题】:LiveData observer not get calledLiveData 观察者不会被调用
【发布时间】:2018-09-26 19:28:23
【问题描述】:

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);}

现在的问题是每当我要删除任何数据时。我的观察者没有收到任何回调。

如果我做错了什么,请纠正。

【问题讨论】:

  • 您找到解决方案了吗?我想知道同样的事情。

标签: android android-architecture-components android-livedata


【解决方案1】:

我假设您正在观察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(当然应用您可能需要的任何转换) .

我希望这会有所帮助。

【讨论】:

  • 我同意你的第一点。回复你的第三点。在使用 MutableLiveData 之前,我使用从 DAO 返回的 LiveData 进行观察。但是有同样的问题,这就是我搬到 MutableLiveData 的原因。
猜你喜欢
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2019-06-10
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多