这个方法的问题是:
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
SharedPreferences preferences = context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
long recipeId = preferences.getLong(WidgetConfigurationActivity.PREF_PREFIX_KEY+appWidgetId, 0);
Intent serviceIntent = new Intent(context, WidgetService.class);
serviceIntent.putExtra(WidgetService.EXTRA_RECIPE_ID, recipeId);
serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
Intent intent = new Intent(context, RecipeListActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget_recipes);
widget.setRemoteAdapter(appWidgetId, R.id.widget_configuration_list_view, serviceIntent);
widget.setEmptyView(R.id.widget_recipe_list_view, R.id.empty_view);
widget.setOnClickPendingIntent(R.id.widget_container, pendingIntent);
//appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_recipe_list_view);
appWidgetManager.updateAppWidget(appWidgetId, widget);
}
在线:
widget.setremoteadapter(应用程序widgetid,
r.id.widget_configuration_list_view,serviceintent);
这是错误的列表视图,R.ID全局名称空间很容易出错。应该是:
widget.setremoteadapter(r.id.widget_recipe_list_view,serviceintent);
这是小部件中远程视图中的ListView。
还要注意,我将“setremoteadapter”更改为使用不推荐使用的其他版本。
一旦进行了此更改,就会在widgetService中调用ongetViewFactory。但是,这会导致数据库崩溃:
java.lang.RuntimeException: Unable to bind to service intellidev.co.bakingapp.widget.WidgetService@15361cf with Intent { dat=intent: cmp=intellidev.co.bakingapp/.widget.WidgetService (has extras) }: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
at android.app.ActivityThread.handleBindService(ActivityThread.java:3538)
at android.app.ActivityThread.-wrap2(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1758)
at android.os.Handler.dispatchMessage(Handler.java:108)
at android.os.Looper.loop(Looper.java:206)
at android.app.ActivityThread.main(ActivityThread.java:6749)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:845)
Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
at android.arch.persistence.room.RoomDatabase.assertNotMainThread(RoomDatabase.java:204)
at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:232)
at intellidev.co.bakingapp.data.daos.RecipeDao_Impl.getRecipe(RecipeDao_Impl.java:129)
at intellidev.co.bakingapp.data.sources.RecipeLocalSource.getRecipe(RecipeLocalSource.java:47)
at intellidev.co.bakingapp.widget.WidgetViewFactory.<init>(WidgetViewFactory.java:24)
at intellidev.co.bakingapp.widget.WidgetService.onGetViewFactory(WidgetService.java:12)
at android.widget.RemoteViewsService.onBind(RemoteViewsService.java:241)
at android.app.ActivityThread.handleBindService(ActivityThread.java:3524)
at android.app.ActivityThread.-wrap2(Unknown Source:0)Â
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1758)Â
at android.os.Handler.dispatchMessage(Handler.java:108)Â
at android.os.Looper.loop(Looper.java:206)Â
at android.app.ActivityThread.main(ActivityThread.java:6749)Â
at java.lang.reflect.Method.invoke(Native Method)Â
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)Â
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:845)Â
但是我会把这个留给你,因为我认为既然远程查看工厂正在被调用,你已经准备好取得更多的进展了。干杯!