当前位置: 首页 > 知识库问答 >
问题:

未调用LiveData观察者

狄赞
2023-03-14
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);}

共有1个答案

闾丘照
2023-03-14

我假设您正在观察allplaylistsongs。当按路径删除时,永远不会更新mutablelivedata。有几种方法可以解决你的问题。

  1. 只要在删除歌曲时更新mutableLiveData即可。因此,您可以通过再次执行GetPlayListSongs任务从回购重新加载所有歌曲。
  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);}
 类似资料:
  • 我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法

  • 我尝试使用这个实现ViewModel。但观察者从未被调用。 基本上,这个应用程序在SAMPLE_URL上发出网络请求,将JSON转换为列表,并通过BookView显示列表。这个应用程序在没有ViewModel的情况下工作得很好。使用ViewModel,应用程序会运行,但Observer从未被调用,也没有显示任何数据。 我在这里做错了什么? BookActivity类: BookViewModel类

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 在onViewCreated中,我设置了Observer对象,以便在LiveData中所做的任何更改都可以在这里得到更改通知: 在ViewModel类中,我将LiveData参数设置为: 在init中,我设置了一个观察者:

  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac

  • 试图让LiveData与Room一起工作: 因为我观察到tdao.getall(),所以我希望在我的活动中,当同步完成时,它会刷新日历。现在,您必须重新加载该活动,以获取在执行同步后放入数据库的数据。我对Room和LiveData很陌生。有什么想法吗?希望我没有拿出太多的代码,这是从一个相当大的应用程序到目前为止。