2016-05-23 2 views
0

У меня есть следующие в моей основной деятельности для входа в TextView элементОбновление Android 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() вызывается из другого потока. Как я могу сделать эту работу должным образом?

ответ

1

Вы должны использовать обработчик, чтобы изменить вид из основного потока.

Что-то вроде этого:

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

Это именно то, что я искал :) Спасибо! Примечание: требуется Java 8 для lambdas –

+0

Любой способ иметь эту работу с Java 1.7 и SDK 17? –

+1

Да. Без lambdas последнюю строку можно написать следующим образом: handler.post (new Runnable() { public void run() { log ("NEW TAG!"); } }); –

1

Используйте runOnUiThread, если вы хотите, чтобы обновить пользовательский интерфейс из другого потока

runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         log("NEW TAG!"); 
        } 
       }); 
+0

Это очень изящное решение! Спасибо! –

Смежные вопросы