收到第一个结果后,如何删除观察者?下面是我尝试过的两种代码方式,但即使我已经删除了观察者,它们也都会继续接收更新.
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) 根据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?
在Google最近发布的Android Architecture Components库中,我们在Transformations类中有两个静态函数.虽然map功能很直接且易于理解,但我发现很难正确理解该switchMap功能.
可以在此处找到switchMap的官方文档.
有人可以用一个实际的例子解释如何以及在哪里使用switchMap功能?
将项目添加到LiveData列表时,我需要获取Observer事件.但正如我所理解的那样,只有当我用新的列表替换旧列表时才会收到事件.例如,当我做下一个时:
list.value = mutableListOf(IssuePost(UserEntity(name, email, photoUrl), issueEntity))
Run Code Online (Sandbox Code Playgroud)
观察者得到事件.但是当我只是将item添加到value时,Observer是静默的.您能否就我如何实施我的需求提出建议?
我正在使用带有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) 如何用初始值初始化MutableLiveData?我正在寻找类似的东西:
val text = MutableLiveData<String>("initial value")
我遇到过建议切换到 StateFlow 的文章。就像这里的那个一样。同样在新的 Android studio 中,StateFlow 支持自动包含在数据绑定功能中,包括协程依赖项。实时数据已在大多数应用程序中使用。我们应该从 LiveData 迁移到 StateFlow 吗?有什么好处?
android android-livedata kotlin-flow kotlin-stateflow android-studio-arctic-fox
将生命周期依赖项从 升级到 后,2.6.0-alpha04我2.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) 我使用 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 次。等等。
有许多示例如何在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 ×10
android-livedata ×10
kotlin ×3
android-architecture-components ×2
android-livedata-transformations ×1
android-room ×1
kotlin-flow ×1
observable ×1
observers ×1