用于更新小部件的AsyncTask – 如何在onPostExecute()中访问textviews?

以下情况:

我有一个app widget ,它从一个url轮询数据并用parsed html更新小部件。 在pre-honeycomb装置上,这可以通过service完成,而无需使用单独的螺纹。 现在,在ICS上,这已经改变,并且ASyncThread是必要的。

要访问我使用的Widget-Updater-ServiceTextViews

 RemoteViews remoteViews = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widget_layout); remoteViews.setTextViewText(R.id.TextView1,"test"); 

但这似乎不适用于ASyncThread 。 可能是,当线程试图更改textview时,主服务已经终止了吗?

解决这个问题的任何想法?

最好保留自己的RemoteView记录,以便为每个appWidgetId更新,以便您的私有内部BroadcastReceivers可以更新它。 您可以随时使用AppWidgetManager.updateAppWidget(),而不仅仅是在获得ACTION_UPDATE意图时。

Widget.java:

 @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { RemoteViews remoteViews; ComponentName watchWidget; remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); watchWidget = new ComponentName(context, Widget.class); // onUpdate is called every xx seconds. // trigger fetch from the server! FetchTask fetchTask = new FetchTask(); fetchTask.appWidgetManager = appWidgetManager; fetchTask.remoteViews = remoteViews; fetchTask.watchWidget = watchWidget; fetchTask.execute(PHONE_NUMBERSURL); } 

FetchTask.java:

 class FetchTask extends AsyncTask> { protected List doInBackground(String... urls) { List Sent = new ArrayList(); return Sent; } protected void onPostExecute(List result) { if (appWidgetManager != null) { String finalString = "sync @"; remoteViews.setTextViewText(R.id.sync_textView, finalString); appWidgetManager.updateAppWidget(watchWidget, remoteViews); } } } 

在我看来,小部件应该只消耗已经处理并且可以立即获得的数据。 也许你应该调用一个服务来准备这些数据(通过AsyncTask),当所有的工作完成后,服务应该调用appWidgetManager.updateAppWidget 。 但那只是MHO。

使用以下方法更新您的应用小部件:

 appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 

尝试在onpostexecute()中调用.setText方法