2011-08-11 10 views

答えて

5

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"); 
    } 
}); 
+0

私はそれが意味を参照してください。私の問題は、私は、Bluetoothを読み取ってバッファから取得したデータをedittextボックスに出力するプログラムを作成していることです。連続読み取りはスレッドで行われます。あなたは結果をどのように出力することができるかについての提案はありますか? –

+0

例を使って答えを更新しました。 – inazaruk

+0

助けてくれてありがとう。私のコードと一緒に使うにはどうすればいいですか?申し訳ありませんが、スレッドに新しいです... スレッドthRead =新しいrunOnUiThread(新しいRunnable(){など...それは働くでしょうか? –

2

まず第一に、あなたのログを見てアプリがシャットダウンしたとき、それは通常のスタックトレースが含まれています。

あなたが通常行うようにあなたはrunOnUiThreadを使用する代わりに、スレッドを実行しないでください。

Runnable thRead = new Runnable(){ 
    public void run() { 
     EditText _txtArea = (EditText) findViewById(R.id.txtArea); 
     startReading(_txtArea); 
    } 
}; 
runOnUiThread(thRead); 

、について説明を:のみUIスレッドがUIコンポーネントの状態を変更することが許可されています。

+0

これは強制終了を停止しましたが、Edittextでは何も変更されていません(テキストが表示されないので)おそらく別のインスタンスであるためでしょうか? –

+0

何か他のことをしていますか? –

+0

スタックトレースはfindViewByIdは実際に何か有用なものを返すと仮定しています。別のコンポーネントで実行している場合、nullになる可能性があります。別の回答を受け入れたので、スタックトレースを投稿する必要はありません。 Handlerクラスもこれには便利ですが、スレッド化は常に並行性エラーなどが発生しやすくなります。 – Jes

0

は、メインスレッドは、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

1

、私の知っている別の方法もあります:

はあなたの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); 
関連する問題