Ich habe gerade angefangen mit Android Concurrency/Looper/Henders zu spielen, und ich habe gerade mit seltsamen Anomalie konfrontiert. Der folgende Code hindert mich nicht daran, Text in TextView aus einem anderen Thread zu setzen.Setzen von Text auf TextView von Hintergrund Thread Anomalie
TextView tv;
Handler backgroundHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.sample_text);
Runnable run = new Runnable() {
@Override
public void run() {
Looper.prepare();
backgroundHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
String text = (String) msg.obj;
tv.setText(Thread.currentThread().getName() + " " + text);
}
};
Looper.loop();
}
};
Thread thread = new Thread(run);
thread.setName("Background thread");
thread.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = backgroundHandler.obtainMessage();
message.obj = "message from UI";
backgroundHandler.sendMessage(message);
}
Und raten Sie mal, was passieren
Aber, wenn ich schlafe Faden Hintergrund für eine Weile
backgroundHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String text = (String) msg.obj;
tv.setText(Thread.currentThread().getName() + " " + text);
}
};
es wirft Ausnahme, wie ich
07-03 18:54:40.506 5996-6025/com.stasbar.tests E/AndroidRuntime: FATAL EXCEPTION: Background thread
Process: com.stasbar.tests, PID: 5996
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7275)
erwartet 0
Kann mir jemand erklären, was passiert ist? Warum konnte ich Text aus verschiedenen Threads setzen?
Ich weiß das, bitte lesen Sie noch einmal meine Post. Ich frage mich, warum es funktioniert, als ich TextView von verschiedenen Thread zugegriffen habe. –