如何在Kotlin中使用Single Live Event展示烤面包

编程入门 行业动态 更新时间:2024-10-25 18:26:15
本文介绍了如何在Kotlin中使用Single Live Event展示烤面包的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我想使用单个直播事件类来显示吐司(例如标志) 这是我尝试的代码. 我不想使用像标志这样的peding.我该如何解决?

I want to use single live event class to show toast (like flag) Here is my code what I tried. I want to not use peding like flag. how do I fix it?

MainViewModel

class MainViewModel(private val movieRepository: MovieRepository) : ViewModel() { val keyword = MutableLiveData<String>() val movieList = MutableLiveData<List<Movie>>() val msg = MutableLiveData<String>() val pending: AtomicBoolean = AtomicBoolean(false) fun findMovie() { val keywordValue = keyword.value ?: return pending.set(true) if (keywordValue.isNullOrBlank()) { msg.value = "emptyKeyword" return } movieRepository.getMovieData(keyword = keywordValue, 30, onSuccess = { if (it.items!!.isEmpty()) { msg.value = "emptyResult" } else { msg.value = "success" movieList.value = it.items } }, onFailure = { msg.value = "fail" } ) } }

MainActivity

private fun viewModelCallback() { mainViewModel.msg.observe(this, { if (mainViewModel.pendingpareAndSet(true, false)) { when (it) { "success" -> toast(R.stringwork_success) "emptyKeyword" -> toast(R.string.keyword_empty) "fail" -> toast(R.stringwork_error) "emptyResult" -> toast(R.string.keyword_result_empty) } } }) }

推荐答案

解决方案

第1步.将SingleLiveEvent.kt复制到您的应用中

/* * Copyright 2017 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * www.apache/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.myapp; import android.util.Log; import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.Observer; import java.util.concurrent.atomic.AtomicBoolean; /** * A lifecycle-aware observable that sends only new updates after subscription, used for events like * navigation and Snackbar messages. * <p> * This avoids a common problem with events: on configuration change (like rotation) an update * can be emitted if the observer is active. This LiveData only calls the observable if there's an * explicit call to setValue() or call(). * <p> * Note that only one observer is going to be notified of changes. */ public class SingleLiveEvent<T> extends MutableLiveData<T> { private static final String TAG = "SingleLiveEvent"; private final AtomicBoolean mPending = new AtomicBoolean(false); @MainThread public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) { if (hasActiveObservers()) { Log.w(TAG, "Multiple observers registered but only one will be notified of changes."); } // Observe the internal MutableLiveData super.observe(owner, t -> { if (mPendingpareAndSet(true, false)) { observer.onChanged(t); } }); } @MainThread public void setValue(@Nullable T t) { mPending.set(true); super.setValue(t); } /** * Used for cases where T is Void, to make calls cleaner. */ @MainThread public void call() { setValue(null); } }

第2步.从代码中使用.

MainViewModel

class MainViewModel(private val movieRepository: MovieRepository) : ViewModel() { val keyword = MutableLiveData<String>() val movieList = MutableLiveData<List<Movie>>() val msg = SingleLiveEvent<String>() fun findMovie() { val keywordValue = keyword.value ?: return if (keywordValue.isNullOrBlank()) { msg.value = "emptyKeyword" return } movieRepository.getMovieData(keyword = keywordValue, 30, onSuccess = { if (it.items!!.isEmpty()) { msg.value = "emptyResult" } else { msg.value = "success" movieList.value = it.items } }, onFailure = { msg.value = "fail" } ) } }

MainActivity

private fun viewModelCallback() { mainViewModel.msg.observe(this, { when (it) { "success" -> toast(R.stringwork_success) "emptyKeyword" -> toast(R.string.keyword_empty) "fail" -> toast(R.stringwork_error) "emptyResult" -> toast(R.string.keyword_result_empty) } }) }

更多推荐

如何在Kotlin中使用Single Live Event展示烤面包

本文发布于:2023-10-16 11:47:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1497467.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:烤面包   如何在   Kotlin   Single   Live

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!