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