我想在我的小部件类中访问Room DB,以便根据存储的数据更新小部件。
这里问题是ViewModelProvider需要一个片段或活动才能使用。
ViewModelProviders.of(fragment).get(YourViewModel.class);
哪一个在app widget类中不可用,那么该怎么做呢?
发布于 2018-08-23 03:46:41
所以在这里回答我自己..
唯一有效的方法是使用上下文从抽象类中获取DB实例,并在后台线程中直接运行DAO查询,而不使用ViewModelProviders类
new AsyncTask<Context, Void, List<Data>>(){ @Override protected List<Quote> doInBackground(Context... context) { List<Data> List=null; AppDatabase db = AppDatabase.getDatabase(context[0]); List = db.DataModel().getData(); return List; } @Override protected void onPostExecute(List<Quote> List) { super.onPostExecute(List); if(List != null){ final Random random=new Random(); for (int appWidgetId : appWidgetIds) { updateAppWidget(context, appWidgetManager, appWidgetId, quoteList.get(random.nextInt(List.size()))); } } } }.execute(context); }
发布于 2018-10-13 19:54:49
如果使用RemoteViewsService填充小部件UI,则可以通过在其onDataSetChanged()
方法中而不是AppWidgetProvider的onUpdate()
方法中包含DAO查询来避免使用AsyncTask。正如onDataSetChanged()
documentation中所述,
在此方法中,可以安全地同步执行
...expensive任务。在此期间,旧数据将显示在小部件中。
这里的另一个优点是,您可以在应用程序的ViewModel观察者的onChanged()
方法中包含对AppWidgetManager.notifyAppWidgetViewDataChanged()
的调用;这将触发onDataSetChanged()
,并且小部件将在每次Room数据库更改时更新,而不仅仅是在onUpdate()
的固定时间间隔更新。
发布于 2019-12-19 19:08:41
我知道这已经有一段时间了,但我只是偶然发现了这个问题,并想在同事Aaron-dunigan-atlee的启发下添加一些有用的东西。
基本上是显示数据库和Dao对象的位置...更重要的是,调用房间查询的onDataSetChanged()
方法。这个例子是为了给应用程序做笔记来说明,正如上面所说的,不需要AsyncTasks anywhere。
public class MyWidgetRemoteViewsService extends RemoteViewsService
{
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent)
{
return new MyRemoteViewsFactory(this.getApplicationContext(), intent);
}
class MyRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory
{
private NotesDao notesDao;
private List<Note> allNotes;
MyRemoteViewsFactory(Context context, Intent intent)
{
MyDb db;
db = MyDatabase.getDatabase(context);
notesDao = db.notesDao();
}
@Override
public void onCreate() { }
@Override
public void onDataSetChanged()
{
allNotes = notesDao.getAllNotes();
}
@Override
public int getCount()
{ ...
sasa
https://stackoverflow.com/questions/51973927
复制相似问题