使Android NFC onTagDiscovered回调线程保持活动状态

时间:2018-03-08 14:07:10

标签: android multithreading callback nfc

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

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中启动looper和消息处理程序并发送消息以指示我的异步任务何时完成并且标记通信可以继续。

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();
    }
}

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

looper不应该保持线程活着吗?

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

1 个答案:

答案 0 :(得分:1)

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