从回调更新Android TextView

问题描述 投票:0回答:2

我在主要活动中有以下内容用于记录到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()是从另一个线程调用的。我怎样才能正常工作?

android multithreading callback textview
2个回答
2
投票

您必须使用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!");
    }
  } );
}

1
投票

如果要从其他线程更新UI,请使用runOnUiThread

runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                       log("NEW TAG!");
                    }
                });
© www.soinside.com 2019 - 2024. All rights reserved.