Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 小部件的runOnUiThread方法模拟?_Java_Android_Android Widget_Widget - Fatal编程技术网

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的代码是在我发布我的答案后添加的,所以这是一个很好的例子这可能是正确的。