なぜこのコードが機能しますか?HandlerThreadのルーパーを設定したHandlerがUIオブジェクトと対話できるのはなぜですか?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("onCreate", Thread.currentThread().toString());
textView = (TextView) findViewById(R.id.textView);
imageView = (ImageView) findViewById(R.id.imageView);
HandlerThread thread = new HandlerThread("myHandlerThread");
thread.start();
mUiHandler = new Handler(thread.getLooper());
mUiHandler.post(new Runnable() {
@Override
public void run() {
Log.i("Thread: ", Thread.currentThread().toString());
Toast.makeText(getApplicationContext(), "Hello Cats!", Toast.LENGTH_SHORT).show();
textView.setText("Hello Cats");
imageView.setImageResource(R.mipmap.ic_launcher);
}
});
}
私はUIオブジェクトと通信することができる唯一のスレッドがUIスレッドである、または私はいくつかの研究を持っているが、まだ答えを見つけていない何か
を欠場することをどこから読んで、助けてくださいので、あなたに感謝多くの人。
これは私が@nshmuraからこのコードを試してみましたエラーが、それは今
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
HandlerThread thread = new HandlerThread("myHandlerThread");
thread.start();
mUiHandler = new Handler(thread.getLooper());
mUiHandler.post(new Runnable() {
@Override
public void run() {
Log.i("Thread: ", Thread.currentThread().toString());
Toast.makeText(getApplicationContext(), "Hello Cats!", Toast.LENGTH_SHORT).show();
textView.setText("Hello Cats");
imageView.setImageResource(R.mipmap.ic_launcher);
}
});
}
});
私にはとても混乱して発生したログ
10-13 18:47:42.888 23841-23841/th.co.me.sampleapp I/onCreate: Thread[main,5,main] 10-13 18:47:42.891 23841-24041/th.co.me.sampleapp I/Thread:: Thread[myHandlerThread,5,main]
UPDATE 1
から得たものです
android.view.ViewRootImpl $ CalledFromWr ongThreadException:ビュー階層を作成した元のスレッドのみがそのビューに触れることができます。
私はあなたのQUEを取得しておりません。 –
no-argsコンストラクタ、またはHandler(Looper.getMainLooper())を使用してハンドラを初期化します。ハンドラはメインスレッドで実行され、ビューを更新できます –