保持 Android NFC onTagDiscover回调线程处于活动状态



我已经定义了所需的类并覆盖了处理NFC事件的onTagDiscovered方法。按预期工作。

public class NfcReader implements NfcAdapter.ReaderCallback {
@Override
public void onTagDiscovered(Tag tag) {
// handle tag data
}
}

我注意到了什么,并且找不到任何解释这一点的文档,这个回调在它自己的线程中运行。 我不确定何时创建此线程,但如果onTagDiscovered我这样做:

Log.i(TAG, "Get ID: " + Thread.currentThread().getId());

每次发现新标记时,它都会返回一个任意 ID。我认为这意味着它在不是主线程的单独线程中运行。

任何人都可以阐明此线程的生命周期吗?

我的问题是我需要在需要发送到标签的消息之间执行一些异步任务。我之前所做的(在修改后的示例项目中)是在onTagDiscovered中启动一个循环器和消息处理程序,并发送消息以指示我的异步任务何时完成并且标签通信可以继续。

public class NfcReader implements NfcAdapter.ReaderCallback {
private NfcV nfcvTag;
@Override
public void onTagDiscovered(Tag tag) {
// handle initial tag discovery
nfcvTag = NfcV.get(tag);
...
// initiate long running task that needs to be 
// complete before we can continue talking to tag
...

if(Looper.myLooper() == null)
Looper.prepare();
mHandlerNfc = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(Message msg) {
// process incoming messages 
...
// continue NFC transcieve.
response = nfcvTag.transceive(cmd);
}
};
Looper.loop();
}
}

但无论出于何种原因,在这个新项目中,我不一致地收到错误,说我正在尝试将消息发送到不再存在的线程。 有时我的消息会通过并且处理程序会得到它们,有时它们不会,因为线程不再存在。

活套不应该让线保持活动吗?

有没有比尝试保持这个线程活着更好的方法? 我这样做是假设这是继续使用标签进行收发所需要的。 是否可以从主线程中先前发现的标签继续收发?

回调线程应该是短暂的。如果要执行更长的操作,则应改用另一个线程。例如,您可以生成一个单独的工作线程,将某些操作发布到 UI 线程或在调用onTagDiscovered()之前创建的其他某个 looper 线程/执行器。

最新更新