我的应用程序具有一个小部件,该小部件显示一个列表,并且列表上方还显示该列表的标题。所有必要的数据都存储在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中的数据)来完成加载?