Android 哪个是用于观察AppWidgetProvider中LiveData的正确LifeCycleOwner
我需要在Android 哪个是用于观察AppWidgetProvider中LiveData的正确LifeCycleOwner,android,Android,我需要在AppWidgetProvider中观察一些LiveData(在onUpdate期间)。我想知道,下面哪一个更适合使用LifeCycleObserver ForeverStartLifecycleOwner(自定义) 或者,我应该使用ProcessLifecycleOwner.get() 两者都很好。但是,哪一个更合适呢?最后,我坚持以下解决方案。只要我没有看到任何现场事故报告,也没有收到客户的投诉,它就可以正常工作。但是,如果你知道更好的方法,请告诉我 ForeverStartLif
AppWidgetProvider
中观察一些LiveData
(在onUpdate
期间)。我想知道,下面哪一个更适合使用LifeCycleObserver
ForeverStartLifecycleOwner(自定义)
或者,我应该使用
ProcessLifecycleOwner.get()
两者都很好。但是,哪一个更合适呢?最后,我坚持以下解决方案。只要我没有看到任何现场事故报告,也没有收到客户的投诉,它就可以正常工作。但是,如果你知道更好的方法,请告诉我 ForeverStartLifecycleOwner 用法
publicstaticvoidready(LiveData-LiveData,LifecycleOwner-LifecycleOwner,Callable-Callable){
T=liveData.getValue();
如果(t!=null){
callable.call(t);
返回;
}
观察(lifecycleOwner,新观察者(){
@凌驾
更改后的公共void(@Nullable T){
removeObserver(这个);
callable.call(t);
}
});
}
公共静态void onUpdate(上下文上下文,AppWidgetManager AppWidgetManager,int appWidgetId){
MediatorLiveData resultLiveData=getResultLiveData(appWidgetId);
准备就绪(resultLiveData、ForeverStartLifecycleOwner.INSTANCE、result->onUpdate(上下文、appWidgetManager、result.stickyNoteConfig、result.note));
}
如果您想让您的所有者通过多种活动生存下来,请使用ProcessLifecycleOwner
,否则这是正确的。我的用例不是应用程序的活动。但是,家庭小部件(应用程序小部件提供商)。由于没有太多关于如何在家庭小部件中使用LiveData的信息,我不确定哪一个更合适。嗨,@CheokYanCheng你找到解决方案了吗?你介意分享一个被接受的答案吗?@RowlandMtetezi我已经添加了答案。请参考它。谢谢。AppWidgetProvider
的寿命可能不够长,无法完成您的背景工作。我建议将工作委托给JobIntentService
,并让它使用一些同步API来获取数据LiveData
是向活动和片段公开数据的好方法,但它不是数据访问的通用解决方案。遗憾的是,Google没有发布关于如何在AppWidgetProvider
类中执行I/O操作的官方指南。我不确定是否要使用JobIntentService
,因为AppWidgetProvider
和JobIntentService
之间的通信似乎相当复杂。我将尝试查看静态并发.Executors
是否适用于我的案例。我曾经使用staticconcurrent.Executors
来交付一个可行的股票市场主页小部件。我首先认为我可以通过使用LiveData
来避免executor。但是,似乎LiveData
不适合使用home widget…如果没有服务,您的进程可能在onUpdate()
(或任何)方法完成后的毫秒内终止。由于JobIntentService
可以使用AppWidgetManager
@Commonware更新应用程序小部件本身,因此JobIntentService
无法与AppWidgetProvider
进行通信(我已找到根本原因!)但是,由于我的眼珠现在几乎要掉下来了,我明天会发布我找到的根本原因。
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.LifecycleRegistry;
import android.support.annotation.NonNull;
public enum ForeverStartLifecycleOwner implements LifecycleOwner {
INSTANCE;
private final LifecycleRegistry mLifecycleRegistry;
ForeverStartLifecycleOwner() {
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.LifecycleRegistry;
import android.support.annotation.NonNull;
public enum ForeverStartLifecycleOwner implements LifecycleOwner {
INSTANCE;
private final LifecycleRegistry mLifecycleRegistry;
ForeverStartLifecycleOwner() {
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
public static <T> void ready(LiveData<T> liveData, LifecycleOwner lifecycleOwner, Callable<T> callable) {
T t = liveData.getValue();
if (t != null) {
callable.call(t);
return;
}
liveData.observe(lifecycleOwner, new Observer<T>() {
@Override
public void onChanged(@Nullable T t) {
liveData.removeObserver(this);
callable.call(t);
}
});
}
public static void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
MediatorLiveData<Result> resultLiveData = getResultLiveData(appWidgetId);
ready(resultLiveData, ForeverStartLifecycleOwner.INSTANCE, result -> onUpdate(context, appWidgetManager, result.stickyNoteConfig, result.note));
}