私はスレッドによって開始された別の関数でのEditTextを変更すると問題が生じていますを変更edittextを変更します。なぜ誰かが知っていますか?AndroidのスレッドのEditText
答えて
UIビューはUI以外のスレッドから変更しないでください。 UIビューに触れることができる唯一のスレッドは、「メイン」または「UI」スレッドです。onCreate()
、onStop()
などのコンポーネントライフサイクル機能を呼び出すスレッドです。
したがって、アプリケーションがUI以外のスレッドからUIビューを変更しようとすると、Androidはこれが許可されていないことを警告する初期の例外をスローします。 UIはスレッドセーフではないため、このような早期警告は実際には素晴らしい機能です。
UPDATE:
あなたはUIを更新するためにActivity.runOnUiThread()
を使用することができます。またはAsyncTask
を使用してください。しかし、あなたのケースでは、Bluetoothからデータを連続的に読み取る必要があるので、AsyncTask
は使用しないでください。ここで
はrunOnUiThread()
の例です:
runOnUiThread(new Runnable() {
@Override
public void run() {
//this will run on UI thread, so its safe to modify UI views.
_txtArea.setText("Changed");
}
});
まず第一に、あなたのログを見てアプリがシャットダウンしたとき、それは通常のスタックトレースが含まれています。
あなたが通常行うようにあなたはrunOnUiThread
を使用する代わりに、スレッドを実行しないでください。
Runnable thRead = new Runnable(){
public void run() {
EditText _txtArea = (EditText) findViewById(R.id.txtArea);
startReading(_txtArea);
}
};
runOnUiThread(thRead);
、について説明を:のみUIスレッドがUIコンポーネントの状態を変更することが許可されています。
これは強制終了を停止しましたが、Edittextでは何も変更されていません(テキストが表示されないので)おそらく別のインスタンスであるためでしょうか? –
何か他のことをしていますか? –
スタックトレースはfindViewByIdは実際に何か有用なものを返すと仮定しています。別のコンポーネントで実行している場合、nullになる可能性があります。別の回答を受け入れたので、スタックトレースを投稿する必要はありません。 Handlerクラスもこれには便利ですが、スレッド化は常に並行性エラーなどが発生しやすくなります。 – Jes
この記事はお役に立ちます。
http://android-developers.blogspot.com/2009/05/painless-threading.html
いくつかのオプションがあります:
1. UIスレッド上で実行し、それをデフォルトでActivity.runOnUiThread(Runnable)
2.使用AsyncTask
は、メインスレッドは、UIスレッドです。このスレッドでは、アプリケーションの外観を変更するすべてのコードを実行する必要があります。 UIを変更できるアプリケーション内に複数のスレッドが必要な場合は、AsyncTaskクラスを使用することをお勧めします。
public someMethod(){
new ChangeTextTask().execute();
}
private class ChangeTextTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
startReading(_txtArea);
return null;
}
}
ただし、複数のスレッドが同時にEditTextオブジェクトにアクセスするのを防ぐために、手順を実行する必要があります。そうしないと、CurrentModificationExceptionエラーが発生します。(作品)
runOnUiThread()
除き
http://developer.android.com/reference/android/os/AsyncTask.html
、私の知っている別の方法もあります:
はあなたのUI(活動)クラスでハンドラを定義します。
public class MainActivity extends Activity {
.....
Handler uiThreadHandler = new Handler() {
public void handleMessage(Message msg) {
Object o = msg.obj;
if (o==null) o = "";
TextView textIn = (TextView)findViewById(R.id.textin);
textIn.setText(o.toString());
}
};
}
をし、いくつかのスレッドの中から呼び出すことができます:
Message msg = uiThreadHandler.obtainMessage();
msg.obj = "Text for EditView";
uiThreadHandler.sendMessage(msg);
- 1. EditTextのAndroidテキストカーソル
- 2. AndroidのUITextView(EditText?)
- 3. TableLayoutのAndroid EditText
- 4. Android EditTextの値
- 5. androidのカスタムEditText
- 6. android edittext複数のedittextウィジェット上のフォーカスボーダー
- 7. AndroidソフトキーボードカバーEdittext android
- 8. Android EditTextのようなGoogle検索EditText
- 9. Edittextをスレッドに渡す
- 10. android - substract edittextのテキスト
- 11. Android EditTextのlogcatエラー
- 12. Androidの1行EditText
- 13. EditText Androidスタジオのキーボード
- 14. リストビューのAndroid EditText - キーボード
- 15. EditTextフィールドのAndroid getText
- 16. Android EditText(ハードウェアキーボードのみ)
- 17. リストビュー内のAndroid EditText
- 18. EditTextフィールドのAndroidシャドウエフェクト。
- 19. Android - EditTextキーボードタイプのプログラミング
- 20. AndroidのEditTextのテキストのみ?
- 21. AndroidのEditTextのワンショットOnFocusChangeListener
- 22. SETERRORメッセージはのEditTextのAndroid
- 23. EditTextオブジェクトのAndroidの問題
- 24. Android EditTextの幅の変更
- 25. ボタンとeditTextのAndroidのバグ
- 26. 複数のユニットタイプのAndroid EditText
- 27. androidのeditTextのページ行
- 28. Android EditTextのテキストのオフセット?
- 29. Android - EditTextのカーソルのスタイリング
- 30. EditTextのAndroidレイアウトの問題?
私はそれが意味を参照してください。私の問題は、私は、Bluetoothを読み取ってバッファから取得したデータをedittextボックスに出力するプログラムを作成していることです。連続読み取りはスレッドで行われます。あなたは結果をどのように出力することができるかについての提案はありますか? –
例を使って答えを更新しました。 – inazaruk
助けてくれてありがとう。私のコードと一緒に使うにはどうすればいいですか?申し訳ありませんが、スレッドに新しいです... スレッドthRead =新しいrunOnUiThread(新しいRunnable(){など...それは働くでしょうか? –