1

我有一个小部件需要在另一个线程中执行一些操作。它有一个方法可以处理一些数据并在小部件上的 TextView 中显示结果。
要实现这一点,我需要在单独的线程中调用我的方法。然后我需要在该方法的末尾包含一些代码以在小部件上显示结果(类似于textView1.setText("my results");
这必须在 UI 线程中完成。我想使用该方法runOnUiThread。但它只存在于一个活动。是小部件类有这种方法的类似物吗?我该怎么做才能在我的小部件中使用该方法?

这是我的代码:

public class MyWidgetProvider extends AppWidgetProvider {

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) 
{
//...
//here I need to launch a method toBeLaunchedInASeparateThread in a separate thread
}

public void toBeLaunchedInASeparateThread()
{
 // ... many operations
 int result = 0;

//here I need to launch the following line in the UI thread to follow Android guidelines
 setTextToTextView(context, "My result is " + result);
}

public static void setTextToTextView(Context context, String text)
    {
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_sample);
        views.setTextViewText(R.id.widgetTextViewCard, text);
        ComponentName myWidget = new ComponentName(context, MyWidgetProvider.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        manager.updateAppWidget(manager.getAppWidgetIds(myWidget), views);      
    }

}
4

2 回答 2

2

您可以使用 Handler 来连接 UI 线程并在其队列中发布。Handler.post(Runnable). 这里的文档

于 2013-11-07T15:58:10.580 回答
1

黑带的答案很棒,但是您也可以使用textView1.post(runnable)类似的方法。这样您就不必创建 Handler 实例,并且代码将在 UI 线程上运行。AFAIK 两种解决方案都会做同样的事情。

对于远程视图:

Handler mHandler = new Handler();//this must be ran on the UI thread.
....
mHandler.post(new Runnable(){
    public void run() {
        toBeLaunchedInASeparateThread();
    }
});
于 2013-11-07T16:20:15.050 回答