标签: android-livedata

LiveData在第一次回调后删除Observer

收到第一个结果后,如何删除观察者?下面是我尝试过的两种代码方式,但即使我已经删除了观察者,它们也都会继续接收更新.

Observer observer = new Observer<DownloadItem>() {
        @Override
        public void onChanged(@Nullable DownloadItem downloadItem) {
            if(downloadItem!= null) {
                DownloadManager.this.downloadManagerListener.onDownloadManagerFailed(null, "this item already exists");
                return;
            }
            startDownload();
            model.getDownloadByContentId(contentId).removeObservers((AppCompatActivity)context);
        }
    };
    model.getDownloadByContentId(contentId).observeForever(observer);
Run Code Online (Sandbox Code Playgroud)
 model.getDownloadByContentId(contentId).observe((AppCompatActivity)context, downloadItem-> {
             if(downloadItem!= null) {
                this.downloadManagerListener.onDownloadManagerFailed(null, "this item already exists");
                return;
            }
            startDownload();
            model.getDownloadByContentId(contentId).removeObserver(downloadItem-> {});
        } );
Run Code Online (Sandbox Code Playgroud)

android observers android-room android-livedata

38
推荐指数
8
解决办法
3万
查看次数

如何清除LiveData存储值?

根据LiveData文档:

LiveData类具有以下优点:

...

始终是最新数据:如果生命周期再次启动(如从后端堆栈返回到启动状态的活动),它将收到最新的位置数据(如果尚未生成).

但有时候我不需要这个功能.

例如,我在ViewModel中跟随LiveData,在Activity中跟踪Observer:

//LiveData
val showDialogLiveData = MutableLiveData<String>()

//Activity
viewModel.showMessageLiveData.observe(this, android.arch.lifecycle.Observer { message ->
        AlertDialog.Builder(this)
                .setMessage(message)
                .setPositiveButton("OK") { _, _ -> }
                .show()
    })
Run Code Online (Sandbox Code Playgroud)

现在每次旋转后都会出现旧的对话框.

有没有办法在处理后清除存储的值或者根本没有使用LiveData?

android android-livedata android-architecture-components

36
推荐指数
4
解决办法
2万
查看次数

如何以及在何处使用Transformations.switchMap?

在Google最近发布的Android Architecture Components库中,我们在Transformations类中有两个静态函数.虽然map功能很直接且易于理解,但我发现很难正确理解该switchMap功能.

可以在此处找到switchMap的官方文档.

有人可以用一个实际的例子解释如何以及在哪里使用switchMap功能?

android android-livedata android-architecture-components

36
推荐指数
4
解决办法
2万
查看次数

将项目添加到LiveData列表时通知观察者

将项目添加到LiveData列表时,我需要获取Observer事件.但正如我所理解的那样,只有当我用新的列表替换旧列表时才会收到事件.例如,当我做下一个时:

list.value = mutableListOf(IssuePost(UserEntity(name, email, photoUrl), issueEntity))
Run Code Online (Sandbox Code Playgroud)

观察者得到事件.但是当我只是将item添加到value时,Observer是静默的.您能否就我如何实施我的需求提出建议?

android kotlin android-livedata

35
推荐指数
5
解决办法
2万
查看次数

对象字段更改的LiveData更新

我正在使用带有LiveData的Android MVVM架构.我有一个像这样的对象

public class User {
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的视图模型看起来像这样

public class InfoViewModel extends AndroidViewModel {
    MutableLiveData<User> user = new MutableLiveData<>();

    public InfoViewModel(@NonNull Application application) {
        super(application);
        User user = new User();
        user.setFirstName("Alireza");
        user.setLastName("Ahmadi");

        this.user.setValue(user);
    }

    public LiveData<User> getUser(){
        return user;
    }

    public void …
Run Code Online (Sandbox Code Playgroud)

android observable android-livedata android-viewmodel

33
推荐指数
5
解决办法
3万
查看次数

具有初始值的MutableLiveData

如何用初始值初始化MutableLiveData?我正在寻找类似的东西:

val text = MutableLiveData<String>("initial value")

android kotlin android-livedata

33
推荐指数
4
解决办法
2万
查看次数

LiveData 与 StateFlow:我们应该从实时数据切换到状态流吗?

我遇到过建议切换到 StateFlow 的文章。就像这里的那个一样。同样在新的 Android studio 中,StateFlow 支持自动包含在数据绑定功能中,包括协程依赖项。实时数据已在大多数应用程序中使用。我们应该从 LiveData 迁移到 StateFlow 吗?有什么好处?

在此输入图像描述

android android-livedata kotlin-flow kotlin-stateflow android-studio-arctic-fox

33
推荐指数
2
解决办法
3万
查看次数

未解决的参考:升级生命周期依赖项后的转换

将生命周期依赖项从 升级到 后,2.6.0-alpha042.6.0-beta01得到了未解决的参考:转换并且它无法import androidx.lifecycle.Transformations分类。

import androidx.lifecycle.Transformations
...
var myList: LiveData<List<Bookmark>> = Transformations.switchMap(
            bookMarkType
        ) { input: Int? ->
            when (input) {
                ARTICLE_BOOKMARK -> return@switchMap repository.articleBookmarks
                WEBSITE_BOOKMARK -> return@switchMap repository.websiteBookmarks
                LINK_BOOKMARK -> return@switchMap repository.linkBookmarks
            }
            repository.websiteBookmarks
        }
Run Code Online (Sandbox Code Playgroud)

android android-livedata android-livedata-transformations

33
推荐指数
2
解决办法
1万
查看次数

从 Fragment 返回时,Flow onEach/collect 会被多次调用

我使用 Flow 而不是 LiveData 来收集片段中的数据。在 Fragment AI 中,观察(或者更确切地说收集)我的片段 onViewCreated 中的数据,如下所示:

lifecycleScope.launchWhenStarted {
            availableLanguagesFlow.collect {
                languagesAdapter.setItems(it.allItems, it.selectedItem)
            }
        }
Run Code Online (Sandbox Code Playgroud)

问题。然后,当我转到片段 B 然后返回片段 A 时,我的收集函数被调用两次。如果我再次访问片段 B 并返回 A - 那么收集函数将被调用 3 次。等等。

android android-fragments kotlin android-livedata

28
推荐指数
1
解决办法
1万
查看次数

使用Android LiveData更新RecyclerView

有许多示例如何在LiveData更改时将新列表推送到适配器.

我正在尝试在巨大的列表中更新一行(例如,帖子的评论数量).重置整个列表只更改一个字段是愚蠢的.

我能够添加观察者onBindViewHolder,但我无法理解何时应该删除观察者

@Override
public void onBindViewHolder(ViewHolder vh, int position) {
    Post post = getPost(position);
    vh.itemView.setTag(post);
    post.getLiveName().observeForever(vh.nameObserver);
    ... 
}
Run Code Online (Sandbox Code Playgroud)

android recycler-adapter android-livedata

27
推荐指数
2
解决办法
2万
查看次数