• 로그인 함 해보끄나?

  • Sarangnamu.net June 17, 2003
    Home Login Profile Study Open Project Q&A Google Code
    Single Live Event
    Last Modify : 08 November, 2018(09:46)
    mvvm 에서 DIALOG 와 같은 이벤트 처리용 val dialog = SingleLiveEvent<DialogParam>() 식으로 viewmodel에 추가한 뒤 activity 에서 observe 하고 사용 viewmodel.run { observeDialog(dialog, mDisposable) } 이리하면 dialog 에 전달해야할 데이터를 갱신하면 observe 에 의해 다이얼로그를 호출해줌 inline fun FragmentActivity.observeDialog(event: SingleLiveEvent<DialogParam>, disposable: CompositeDisposable? = null) { event.observe(this, Observer { dialog(it, disposable) }) } inline fun Activity.dialog(params: DialogParam, disposable: CompositeDisposable? = null) { val bd = AlertDialog.Builder(this) bd.setMessage(params.message) params.title?.run { bd.setTitle(this) } params.positiveStr?.run { bd.setPositiveButton(this) { dlg, _ -> params.listener?.invoke(true, dlg) }} params.negativeStr?.run { bd.setNegativeButton(this) { dlg, _ -> params.listener?.invoke(false, dlg) }} val dlg = bd.show() if (params.timer > 0) { disposable?.add(Observable.interval(1, TimeUnit.SECONDS) .take(1).subscribe { dlg.dismiss() }) } } data class DialogParam ( var message: String, var positiveStr: String? = null, var title: String? = null, var negativeStr: String? = null, var listener: ((Boolean, DialogInterface) -> Unit)? = null, var timer: Int = 0 ) /* * 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 * * http://www.apache.org/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 net.sarangnamu.common.arch import android.util.Log import androidx.annotation.MainThread 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. * * * 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(). * * * Note that only one observer is going to be notified of changes. */ class SingleLiveEvent<T> : MutableLiveData<T>() { private val pending = AtomicBoolean(false) @MainThread override fun observe(owner: LifecycleOwner, observer: Observer<in T>) { if (hasActiveObservers()) { Log.w(TAG, "Multiple observers registered but only one will be notified of changes.") } // Observe the internal MutableLiveData super.observe(owner, Observer<T> { t -> if (pending.compareAndSet(true, false)) { observer.onChanged(t) } }) } @MainThread override fun setValue(t: T?) { pending.set(true) super.setValue(t) } /** * Used for cases where T is Void, to make calls cleaner. */ @MainThread fun call() { value = null } companion object { private const val TAG = "SingleLiveEvent" } }

    Comment


    입력하3 1542329711



    Locations of visitors to this page