ジオコーダーを使用してアドレスを取得するワーカースレッドがあり、完了したら、アプリケーションスレッドのTextViewに結果を表示したいのですが、ワーカースレッドからsetText()を使用すると例外が発生するため、ベストプラクティスは次のとおりです。それを行う?
質問する
747 次
3 に答える
1
Android UIビューは、外部スレッドからアクセスしないでください。ビューのメソッドを呼び出すコードは、UIスレッドでのみ実行する必要があります。AsyncTaskを使用する必要があります。別のスレッドで実行されているタスクからUIを更新するための便利なコールバックメソッドを提供します。
于 2012-09-09T19:13:15.380 に答える
1
あなたのコードを見たり、どんな例外を知らずに言うのは難しいです:
ただし、次の点を確認してください。
- textViewオブジェクトは、レイアウト内のオブジェクトにリンクされています(findViewById(R.id.textView1))
- レイアウトに表示されますか?(要素の寸法が合計されない場合、ビューが画面から押し出されることがあります)
- それは本当にあなたが設定しようとしている文字列ですか?(intなどではありませんか?)
于 2012-09-09T19:24:18.797 に答える
1
テキストを設定するスレッド内でこれを試してください。
// you should finalize your text before using it in another thread,
// else the IDE would show an error
final String text = yourTextToBeSet;
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(text);
}
});
非UIスレッドでsetText()を呼び出すときに発生する例外は、非UIスレッドでUIに関連するものを呼び出すことができないためです。上記のように、runOnUiThread(Runnable)を簡単に呼び出して、UIスレッドでのコード実行を迂回させることができます。
コードがそれほど単純でない場合、このソリューションは十分ではないことに注意してください。そのような状況では、AsyncTaskを使用することをお勧めします。
于 2012-09-09T19:11:05.787 に答える