android - 从回调更新 Android TextView

标签 android multithreading callback textview

我的主要 Activity 中有以下内容用于登录 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!");
}

当在我的主要 Activity 中使用 log() 时,它会按预期工作。但是当回调尝试使用它时,它不会记录数据,之后 TextView 不再更新正常日志。我猜这是因为 onTagDiscovered() 是从不同的线程调用的。我怎样才能让它正常工作?

最佳答案

您必须使用处理程序从主线程修改 View 。

类似这样的事情:

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!");
    }
  } );
}

关于android - 从回调更新 Android TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37384812/

相关文章:

android - 如何使用 Intent 来更新 Activity ?

ios - 如何仅在从网络获取数据后显示tableView? ( swift )

python - 让 SQLite3 与多线程一起工作

javascript - jQuery,任何请求之前ajax请求的默认回调?

android - 处理 DialogFragment 回调的最佳方式是什么?

android - 如何使用 Android TV 画中画

java - 导航回可重用 Activity

android - 我在尝试将 Google Sign In 集成到我的 Android 应用程序时遇到错误 : Cannot Resolve Symbol GoogleSignIn

c++ - 为什么我的线程计数器并不总是完成?

javascript - 使用 Promise 设置一个变量以从回调函数中获取返回值