窗口小部件未从数据库(房间)加载数据

时间:2019-04-25 10:09:58

标签: java android android-widget

我的应用程序具有一个小部件,该小部件显示一个列表,并且列表上方还显示该列表的标题。所有必要的数据都存储在Room数据库中。我设法通过RemoteViews加载了列表数据,但找不到一种将标题加载到列表上方的方法。也许有人知道解决方案?

到目前为止,我尝试过的事情:在我的AppWidgetProvider类中,我试图通过对数据库和dao的直接访问来加载数据,并抛出“ IllegalStateException:无法访问主线程上的数据库”。有趣的事实:在AndroidX之前的版本中,这种方法以某种方式起作用。

接下来,我尝试在小部件onUpdate()方法中同时使用AsyncTask和AppExecutors(请参见下面的代码)。两者最终得到相同的结果:加载速度太慢,标题没有填充,因此为空白。

public class FavoriteWidget extends AppWidgetProvider {

    public static final String LOG_TAG = FavoriteWidget.class.getSimpleName();

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {

        AppDatabase db = AppDatabase.getsInstance(context);

        Intent serviceIntent = new Intent(context, FavoriteWidgetService.class);
        serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.favorite_widget);
        AppExecutors.getInstance().diskIO().execute(new Runnable() {
            @Override
            public void run() {
                String favName = db.dataDao().getFavorite().getName();
                Log.d(LOG_TAG, "Fetching the favorite name from db: " + favName);
                views.setTextViewText(R.id.appwidget_text, favName);
            }
        });
        views.setRemoteAdapter(R.id.widget_list, serviceIntent);
        Log.d(LOG_TAG, "Setting the ListView");
        views.setEmptyView(R.id.widget_list, R.id.empty_view);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

日志应首先显示已提取favName,然后应设置ListView,但实际上却是相反,因为加载需要太多时间。有什么方法可以加快加载速度,或者以其他方式(同时仍使用db中的数据)来完成加载?

0 个答案:

没有答案