Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 未调用LiveData观察程序_Android_Android Architecture Components_Android Livedata - Fatal编程技术网

Android 未调用LiveData观察程序

Android 未调用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

ViewModel、Repository和Dao类如下所述

在片段中实例化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;
    }
}}
公共类播放列表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
  • 您可以将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);}
    
    @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);}