Service或自定義物件使用LiveData
一,LiveData繫結AppCompatActivity或Fragment使用
有些情況我們需要在activity或service或其他物件上繫結使用。
正常情況下使用,this是Activity帶有生命週期該activity實現LifecycleOwner
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
LifecycleOwner,
ViewModelStoreOwner,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner
mTestViewModel = ViewModelProviders.of(this, new TestViewModel.Factory(mkey)).get(TestViewModel.class);
MutableLiveData<String> nameEvent = mTestViewModel.getNameEvent();
nameEvent.observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
Log.i(TAG, "onChanged: s = " + s);
}
});
二,以下是在Service上使用LiveData例子
1.在需要監聽的物件上實現LifecycleOwner介面
實現生命週期管理物件返回LifecycleRegistry生命週期管理器
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
2.LifecycleRegistry物件在需要生命週期管理的地方標註(例如Service裡面的
onCreate,onStart,onBind,onUnbind,onStartCommand,onDestroy)如果是其他物件可以根據需求對應狀態。
3.新增監聽
final Observer<String> statusObserver = new Observer<String>() {
@Override
public void onChanged(@Nullable final String newName) {
Log.d("PackageViewModel", TAG+" onChanged: " + newName);
}
};
PackageViewModel.getsInstance().getStatus().observe(this, statusObserver);
完整程式碼:
public class PackageViewModel extends ViewModel {
private MutableLiveData<String> status = new MutableLiveData<>();
private static volatile PackageViewModel sInstance;
private PackageViewModel(){
}
public static PackageViewModel getsInstance() {
if(sInstance == null){
synchronized (PackageViewModel.class){
sInstance = new PackageViewModel();
}
}
return sInstance;
}
public MutableLiveData<String> getStatus() {
return status;
}
}
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.Observer;
public class MyService extends Service implements LifecycleOwner {
private final String TAG = getClass().getSimpleName();
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
public void onCreate() {
super.onCreate();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
initLiveDataObserver();
}
private void initLiveDataObserver() {
final Observer<String> statusObserver = new Observer<String>() {
@Override
public void onChanged(@Nullable final String newName) {
Log.d(TAG, " onChanged: " + newName);
}
};
PackageViewModel.getsInstance().getStatus().observe(this, statusObserver);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
return null;
}
@Override
public boolean onUnbind(Intent intent) {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
PackageViewModel.getsInstance().getStatus().removeObservers(this);
super.onDestroy();
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
非同步傳送訊息
PackageViewModel.getsInstance().getStatus().postValue(“測試");
相關文章
- CloudFoundry增加自定義serviceCloud
- vue自定義全域性元件(或自定義外掛)Vue元件
- angular6自定義服務serviceAngular
- Laravel自定義Make命令生成Service類Laravel
- Javascript 定義類或物件JavaScript物件
- 自定義許可權物件物件
- AXIS - 傳遞自定義物件物件
- NSUserDefault 儲存自定義物件物件
- 自定義物件池實踐物件
- Oracle RAC的自定義service自啟動Oracle
- 放棄官方,擁抱自我,自定義 LiveData 才是最合適的LiveData
- SAP自定義許可權物件物件
- 自定義事件相容處理物件事件物件
- 巧用GenericObjectPool建立自定義物件池Object物件
- 集合框架-去重自定義物件案例框架物件
- HashCode 和 Equals 的使用 - 使用自定義物件作為HashMap的Key例子物件HashMap
- .NET 中Newtonsoft的使用 自定義物件的序列化物件
- 使用Photos自定義相簿
- MySQL使用之五_自定義函式和自定義過程MySql函式
- 物件導向 約束、自定義異常、加密物件加密
- webService學習(二)—— 呼叫自定義物件引數Web物件
- Python 3.x自定義迭代器物件Python物件
- 自定義物件封裝資料警告解決物件封裝
- 自定義物件池在 Caffeine 框架中實踐物件框架
- 使用 Dockerfile 自定義 Nginx 映象DockerNginx
- jquery自定義事件的使用jQuery事件
- GitLab使用自定義埠Gitlab
- C#使用自定義特性C#
- 自定義Directive使用ngModel
- openfire使用自定義使用者表
- 只在堆上或只在棧上定義物件物件
- 【譯】LiveData 使用詳解LiveData
- Python進階:自定義物件實現切片功能Python物件
- 在Luminar 4中向天空新增自定義物件物件
- 向HashSet插入自定義物件判斷是否重複物件
- c++ unordered_map/set自定義物件的hashC++物件
- 使用 FVWM 自定義 Linux 桌面Linux
- Angular 自定義管道 pipes 的使用Angular