我在主要活动中有以下内容用于记录到TextView元素
public synchronized void log(String msg) {
TextView t=(TextView)findViewById(R.id.log);
t.append(msg + "\n");
}
我还有以下回调功能来处理NFC标签:
@Override
public void onTagDiscovered(Tag tag) {
log("NEW TAG!");
}
当我从我的主要活动中使用log()
时,它按预期工作。但是当回调尝试使用它时,它不会记录数据,之后TextView不再更新正常日志。我猜这是因为onTagDiscovered()
是从另一个线程调用的。我怎样才能正常工作?
您必须使用Handler来修改主线程中的视图。
像这样的东西:
private Handler handler;
public void onCreate(...) {
(...)
handler = new Handler(); // Initialize the Handler from the Main Thread
}
(...)
@Override
public void onTagDiscovered(Tag tag) {
handler.post( () -> log("NEW TAG!") );
}
或者,如果您不想/不能使用Java 1.8 Lambda表示法
@Override
public void onTagDiscovered(Tag tag) {
handler.post( new Runnable() {
public void run() {
log("NEW TAG!");
}
} );
}
如果要从其他线程更新UI,请使用runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
log("NEW TAG!");
}
});