Почему этот код работает?Почему обработчик, установивший петлитель HandlerThread, может взаимодействовать с объектами пользовательского интерфейса?
@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);
}
});
}
я прочитал где-то, что только поток, который может взаимодействовать с объектами пользовательского интерфейса является потоком пользовательского интерфейса, или я что-то пропустил
у меня есть некоторые исследования, но не нашел ответ еще, пожалуйста, помогите, спасибо много парней.
это то, что я получил от журнала
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
я попробовал этот код из @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);
}
});
}
});
android.view.ViewRootImpl $ CalledFromWr ongThreadException: Только исходный поток, создавший иерархию представлений, может коснуться его представлений.
я не получаю ваш Que. –
Инициализируйте обработчик с помощью конструктора no-args или с помощью Handler (Looper.getMainLooper()) ... Таким образом, ваш обработчик будет запускаться в основном потоке, и вы можете обновить свои представления из него. –