Java 小部件的runOnUiThread方法模拟?
我有一个小部件,它需要在另一个线程中执行一些操作。它有一个处理某些数据的方法,并在小部件的文本视图中显示结果。Java 小部件的runOnUiThread方法模拟?,java,android,android-widget,widget,Java,Android,Android Widget,Widget,我有一个小部件,它需要在另一个线程中执行一些操作。它有一个处理某些数据的方法,并在小部件的文本视图中显示结果。 为了实现这一点,我需要在单独的线程中调用我的方法。然后,我需要在该方法的末尾包含一些代码,以便在小部件上显示结果(类似于textView1.setText(“我的结果”)这必须在UI线程中完成。我想使用方法runOnUiThread。但它只存在于一个活动中。小部件类是否有类似的方法?在我的小部件中如何使用该方法 这是我的密码: public class MyWidgetProvider
为了实现这一点,我需要在单独的线程中调用我的方法。然后,我需要在该方法的末尾包含一些代码,以便在小部件上显示结果(类似于
textView1.setText(“我的结果”)
这必须在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);
}
}
您可以使用处理程序与UI线程连接并在其队列上发布。
Handler.post(Runnable)
。文档blackbelt的答案很好,但是您也可以使用textView1.post(Runnable)
和类似的方法。这样,您不必创建处理程序实例,代码将在UI线程上运行。两种解决方案的作用完全相同
对于远程视图:
Handler mHandler = new Handler();//this must be ran on the UI thread.
....
mHandler.post(new Runnable(){
public void run() {
toBeLaunchedInASeparateThread();
}
});
在我的例子中,
Handler
是什么?我应该使用代码中的某些内容,还是需要创建一个新的Handler
?我已经在上面发布了我的代码。请看一看,我应该放在哪里,放什么?如果我的代码中没有明确的textView1
,还有什么东西有post(runnable)
method在我的例子中会起作用吗?小部件的全部要点是,您实际上从来不会操纵视图本身,而是只操纵RemoteView和视图ID。因此,您没有可以调用post(runnable)的视图
。这个答案不正确。@njzk2,你能给我建议一种从另一个线程更新widget的textView的替代方法吗?blackbelt的答案是正确的。你需要阅读关于处理程序的内容。你可以看看这个Vogella教程中的处理程序部分:RemoteView的代码是在我发布我的答案后添加的,所以这是一个很好的例子这可能是正确的。