Permalink
Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.
Sign up| /* | |
| * 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 com.example.android.architecture.blueprints.todoapp; | |
| import android.arch.lifecycle.LifecycleOwner; | |
| import android.arch.lifecycle.MutableLiveData; | |
| import android.arch.lifecycle.Observer; | |
| import android.support.annotation.MainThread; | |
| import android.support.annotation.Nullable; | |
| import android.util.Log; | |
| 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(LifecycleOwner owner, final Observer<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, new Observer<T>() { | |
| @Override | |
| public void onChanged(@Nullable T t) { | |
| if (mPending.compareAndSet(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); | |
| } | |
| } |