android - 使 Android NFC onTagDiscovered 回调线程保持 Activity 状态

标签 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 中启动一个循环器和消息处理程序,并发送消息以指示我的异步任务何时完成以及标签通信可以继续。

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 不应该让线程保持 Activity 状态吗?

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

最佳答案

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

关于android - 使 Android NFC onTagDiscovered 回调线程保持 Activity 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49175075/

相关文章:

android - Google Maps API v2 灰屏

c# - 如何将行写入线程安全的文本文件 - 多线程

javascript - 在 for 循环中向回调函数添加参数

c++ - 关于对抗逆变的问题。回调相关问题

具有 bool 值的 JavaScript 回调函数

android - Bluetooth Chat Sample 从Android SDK 编译--> BluetoothChat.apk。有没有不兼容的?

android - 为什么 Volley 退回到 SSLV3?

Android 2.3.3 忽略媒体查询和 jquery

使用 std::atomic 的 C++11 无锁队列(多作者,单消费者)

java - java线程是如何调度的?