이 코드가 작동하는 이유는 무엇입니까?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에서이 코드를 시도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
로그에서 가져온 것입니다 및 오류가 지금 나에게
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 : 뷰 계층 구조를 만든 원래 스레드 만 해당 뷰를 만질 수 있습니다.
나는 당신의 가야를 받고 있지 않다. –
핸들러를 no-args 생성자 또는 Handler (Looper.getMainLooper())를 사용하여 초기화하십시오. 이렇게하면 핸들러가 주 스레드에서 실행되고이 핸들러에서 뷰를 업데이트 할 수 있습니다 –