更新小部件的AsyncTask - 如何在onPostExecute()中访问TextView?

8
以下情况:
我有一个应用小部件,可以从URL轮询数据,并使用解析的HTML更新小部件。在早期的设备上,这可以通过服务而不使用单独的线程来完成。现在,在Android 4.0以上版本中,需要使用ASyncThread。
为了访问Widget-Updater-Service中的TextView,我使用:
RemoteViews remoteViews = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widget_layout);
remoteViews.setTextViewText(R.id.TextView1,"test"); 

但是这似乎在ASyncThread中不起作用。可能是因为当线程尝试更改textview时,主服务已经终止了吗?

有什么解决这个问题的想法吗?


请注意,您可以使用StrictMode.ThreadPolicy在Android 3.0+上更改默认行为,以保持允许网络操作在UI线程上运行。 - yorkw
我无法直接评论,因为我是一个新用户,但我把它放在pastebin上:http://pastebin.com/HQYaJBAm - skyworxx
@yorkw 改变政策就解决了问题,尽管这可能是一个可怕的、可怕的hack。 - skyworxx
@skyworxx,我有同样的问题,如果你解决了这个问题,请在这里发帖...!!! - Android Boy
我已经发布了解决方案,@AndroidBoy - Erti-Chris Eelmaa
显示剩余2条评论
4个回答

4

最好记录 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<String, Integer, List<String>> {

    protected List<String> doInBackground(String... urls) {
        List<String> Sent = new ArrayList<String>();
        return Sent;
    }

    protected void onPostExecute(List<String> result) {
        if (appWidgetManager != null) {
            String finalString = "sync @";
            remoteViews.setTextViewText(R.id.sync_textView, finalString);
            appWidgetManager.updateAppWidget(watchWidget, remoteViews);
        }
    }

}

我尝试了你的方法,参考链接:http://stackoverflow.com/questions/20082315/using-json-to-match-a-string-with-todays-date 但是我一直得到一个FC。 - Si8

0
在我看来,小部件应该只消耗已经处理并及时可用的数据。也许你应该调用一个服务来准备这些数据(通过AsyncTask),当所有工作都完成时,服务应该调用appWidgetManager.updateAppWidget。但这只是我的个人意见。

-1
使用以下方法来更新您的应用程序小部件:
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);

问题出在“remoteViews”,我无法从异步线程中访问它。 - skyworxx

-2
尝试在onPostExecute()中调用.setText方法。

1
没有“findvaluebyid”方法,因此我无法使用setText来更新小部件。 - skyworxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接