1

別のスレッドでいくつかの操作を行う必要があるウィジェットがあります。一部のデータを処理し、結果をウィジェットの TextView に表示するメソッドがあります。
これを実装するには、別のスレッドでメソッドを呼び出す必要があります。次に、ウィジェットに結果を表示するために、そのメソッドの最後にコードを含める必要があります( textView1.setText("my results");.ウィジェットクラスのこのメソッドの類似物はありますか?ウィジェットでそのメソッドを使用するにはどうすればよいですか?
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

blackbelt の答えは素晴らしいですが、textView1.post(runnable)そのような方法を使用することもできます。この方法では、Handler インスタンスを作成する必要はなく、コードは UI スレッドで実行されます。私の知る限り、両方のソリューションはまったく同じことを行います。

RemoteView の場合:

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 に答える