Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 哪个是用于观察AppWidgetProvider中LiveData的正确LifeCycleOwner_Android - Fatal编程技术网

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
是否适用于我的案例。我曾经使用static
concurrent.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));
}