从回调更新Android TextView

时间:2016-05-23 07:19:12

标签: android multithreading callback textview

我在主要活动中有以下内容,用于记录TextView元素

declare @sql as varchar(max);

set @sql = 'select ' + stuff((select ',' + t.c1 + ' as [' + coalesce(t.c2, t.c1) + ']'
            from (
                select t1.Column_name as c1, t2.[Desc] as c2
                from information_schema.columns t1
                left join table2 t2
                on t1.column_name = t2.[column]
                where t1.table_name = 'table1'
            )t
            for xml path('')
        ), 1, 1, '');

select @sql+= ' from table1;';

exec(@sql);

我还有以下回调功能来处理NFC标签:

public synchronized void log(String msg) {
    TextView t=(TextView)findViewById(R.id.log);
    t.append(msg + "\n");
}

在我的主要活动中使用@Override public void onTagDiscovered(Tag tag) { log("NEW TAG!"); } 时,它会按预期工作。但是当回调尝试使用它时,它不会记录数据,之后TextView不再更新正常日志。我猜这是因为log()是从另一个线程调用的。我怎样才能正常工作?

2 个答案:

答案 0 :(得分:2)

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

这样的事情:

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 :(得分:1)

如果要从其他线程

更新UI,请使用runOnUiThread
runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                       log("NEW TAG!");
                    }
                });