是否可以在AppWidgetProvider中使用LiveData

时间:2018-09-25 07:21:03

标签: android android-architecture-components

在我的旧应用中,这就是我在android:id="@+id/root_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:fitsSystemWindows="false"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/forgot_screen_send_button" android:layout_width="100dp" android:layout_height="45dp" android:layout_marginLeft="30sp" android:layout_marginRight="30dp" android:layout_marginTop="10dp" android:layout_marginBottom="20dp" android:layout_gravity="center_horizontal" android:background="@drawable/blue_color_bg_rec" android:text="Send" android:layout_alignParentBottom="true" android:textColor="@color/white" android:textAllCaps="false" android:textSize="18sp"/> </LinearLayout> </LinearLayout> 的{​​{1}}函数中执行耗时的I / O操作的方式。

AppWidgetProvider

我认为这不是一个好方法,尤其是对于Android 8而言。

我喜欢onUpdate概念,因为我们不需要显式处理线程。但是,它使我们能够执行耗时的操作而不会阻塞主线程。

我想知道,是否可以在public class MyAppWidgetProvider extends AppWidgetProvider { private static ExecutorService thread_executor = java.util.concurrent.Executors.newFixedThreadPool(1); @Override public void onUpdate( Runnable runnable = ... thread_executor.execute(runnable); 内使用LiveData并附加一个LiveData来执行耗时的I / O操作(例如从SQLite数据库中读取)?

我不确定如何做到这一点,因为我不知道如何在Observer中获得AppWidgetProvider来观察LifecycleOwner

1 个答案:

答案 0 :(得分:0)

是的,您可以在AppWidgetProvider中使用LiveData。 (我知道)有两种获取LifecycleOwner的方法:

  1. 您可以致电ProcessLifecycleOwner.get()
  2. 您可以从this answer复制该示例。

这两种方法均有效,由您选择要使用的方法。

但是:

您不需要LifecycleOwner,可以使用liveData.observeForever(Observer)。实际上,如果使用LifecycleOwner,它可能会引入一些错误:当所有者移至DESTROYED状态时,您的观察者将不会被称为 1

您不应忘记致电liveData.removeObserver(Observer)