他のスレッドから GUI を更新するには、基本的に 2 つの主な方法があります。
次のいずれかの方法で java.lang.Runnable を使用します。
Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long) Handler.post(Runnable)
android.os.Message を使用します。
Handler.sendMessage(Message) / Handler.handleMessage(Message)
AsyncTask を使用することもできますが、私の質問は、非常に単純なコンポーネントを更新するユース ケースに重点を置いています。両方のアプローチを使用してそれがどのように行われるか見てみましょう:
ランナブルの使用:
TextViev tv = ...; final String data = "hello"; Runnable r = new Runnable() { @Override public void run(){ tv.setText(data); } }; //Now call Activity.runOnUiThread(r) or handler.post(r), ...
メッセージの使用:
Message m = handler.obtainMessage(UPDATE_TEXT_VIEW, "hello"); handler.sendMessage(m); //Now on handler implementation: @Override public void handleMessage(Message msg) { if(msg.what == UPDATE_TEXT_VIEW){ String s = (String) msg.obj; tv.setText(data); } ... //other IFs? }
私見、メッセージは次の理由で行くべき道ではありません:
- Android 以外の新しいプログラマーには理解しにくい (構築中にハンドラーがそのスレッドにフックする)。
- メッセージがプロセス境界を超える場合、オブジェクト ペイロードは Parcellable である必要があります。
- メッセージは再利用されます (適切にクリーンアップしないとエラーが発生しやすいですか?)
- ハンドラーには 2 つの役割があります (メッセージを送信するだけでなく、メッセージを処理することもできます)。
- メッセージ属性はパブリックですが、getter/setter も提供します。
一方、Runnables はよく知られているコマンド パターンに従い、プログラマーにとってより使いやすく、読みやすくなっています。
Runnables よりも Messages を使用する利点は何でしょうか? メッセージは、現代の Android プログラミングでバックグラウンドにプッシュされますか? Runnables では実行できない Messages で実行できることはありますか?
前もって感謝します。