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(“測試");
相關文章
- vue自定義全域性元件(或自定義外掛)Vue元件
- angular6自定義服務serviceAngular
- Laravel自定義Make命令生成Service類Laravel
- 【Linux】自定義開機啟動serviceLinux
- 自定義物件池實踐物件
- Oracle RAC的自定義service自啟動Oracle
- 放棄官方,擁抱自我,自定義 LiveData 才是最合適的LiveData
- 自定義事件相容處理物件事件物件
- 巧用GenericObjectPool建立自定義物件池Object物件
- GitLab使用自定義埠Gitlab
- 物件導向 約束、自定義異常、加密物件加密
- 自定義物件池在 Caffeine 框架中實踐物件框架
- 自定義物件封裝資料警告解決物件封裝
- Python進階:自定義物件實現切片功能Python物件
- Prometheus Operator自定義監控物件 -- Ingress-NginxPrometheus物件Nginx
- 在Luminar 4中向天空新增自定義物件物件
- MySQL使用之五_自定義函式和自定義過程MySql函式
- LiveData && ViewModel使用詳解LiveDataView
- 【譯】LiveData 使用詳解LiveData
- 使用 FVWM 自定義 Linux 桌面Linux
- jquery自定義事件的使用jQuery事件
- Facade 門面自定義使用
- 使用 Dockerfile 自定義 Nginx 映象DockerNginx
- 向HashSet插入自定義物件判斷是否重複物件
- 如何在Kubernetes 裡新增自定義的 API 物件(一)API物件
- 聊聊自定義SPI如何使用自定義標籤注入到spring容器中Spring
- 小程式自定義元件的使用元件
- draw.io 使用自定義字型自定義字型
- Angular 自定義管道 pipes 的使用Angular
- 在Flutter中使用自定義IconFlutter
- KingbaseES 自定義運算子使用示例
- springBoot自定義註解的使用Spring Boot
- Laravel框架:通過自定義命令建立service服務層初體驗Laravel框架
- 使用 voyager 如何自定義,使用者表
- 工廠模式建立物件和自定義建構函式建立物件的異同模式物件函式
- Flutter自定義Widget和使用方法Flutter
- 如何使用小程式自定義元件功能元件
- Android自定義View之Canvas的使用AndroidViewCanvas