【问题标题】:runOnUiThread method analog for widget?小部件的runOnUiThread方法模拟?
【发布时间】:2013-11-07 15:56:53
【问题描述】:

我有一个小部件需要在另一个线程中执行一些操作。它有一个方法可以处理一些数据并在小部件上的 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);      
    }

}

【问题讨论】:

    标签: java android android-widget widget


    【解决方案1】:

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

    【讨论】:

    • 在我的情况下Handler 是什么?我应该使用我的代码中的某些东西,还是需要以某种方式创建一个新的Handler
    • 我已经在上面发布了我的代码。请你看一下并说我应该在哪里放什么?
    【解决方案2】:

    blackbelt 的答案很棒,但是您也可以使用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();
        }
    });
    

    【讨论】:

    • 如果我的代码中没有明确的textView1,还有什么post(runnable) 方法适用于我的情况?
    • 小部件的全部意义在于,您从不实际操作视图本身,而只是远程视图和视图 ID。因此,您没有可以调用post(runnable) 的视图。这个答案不正确。
    • @njzk2 ,您能否建议我从另一个线程更新小部件的 textView 的另一种方法?
    • 黑带的答案是正确的。您需要阅读有关处理程序的信息。您可以查看此 Vogella 教程中的处理程序部分:vogella.com/articles/AndroidBackgroundProcessing/…
    • remoteviews 的代码是在我发布答案后添加的,所以它尽可能正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多