小部件内的 runOnUiThread

runOnUiThread inside a widget

我想在我构建的应用程序小部件中发出 HTTP 请求。

这个想法是每隔几个小时,小部件就会通过发出 HTTP 请求来更新自己,并使用它的信息来更新它的视图。

我已经尝试在 onUpdate 函数中使用 Thread,HTTP 请求工作正常,问题是我无法使用 runOnUiThread() 进行更新意见,因为我没有parentactivity到运行这个功能上。

是否有另一种方法可以在 Thread 中更新小部件的视图?

示例代码:

public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    final int N = appWidgetIds.length;

    for (int i=0; i<N; i++) {
        final int appWidgetId = appWidgetIds[i];

        final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_card);

        Thread thread = new Thread(new Runnable() {
           @Override
           public void run() {
              try {
                 Http.Response resp = Http.postData("http://www.example.com", null, null, null);
                 views.setTextViewText(R.id.textview, resp.body);
              }
              catch (Exception ex) {
                  Log.e(TAG, Log.getStackTraceString(ex));
              }
         }
     }
}

先谢谢你。

I've already tried to use a Thread in onUpdate function

这不是个好主意。您的流程可以在您的工作完成之前终止。相反,创建一个 IntentService 来执行网络 I/O 并通过 AppWidgetManager.

更新应用小部件

the problem is that I can't use runOnUiThread() to update the views, because I have no parent activity to run this function on

由于您没有任何要更新的视图,因此您不必担心这一点。您可以设置 RemoteViews 并将它们交给后台线程上的 AppWidgetManager