---
title: 启动recvData逻辑线程
description: "预先启动接收的逻辑线程，并注册音频和录音的回调对象。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcps/boostcph/instrucstreamengine/kunpengcpsinstruction_16_0019.html
sourcePath: /source/zh/kunpengcps/boostcph/instrucstreamengine/kunpengcpsinstruction_16_0019.html
indexId: 674dceb1938c19830d72c5137f77d9546e0f08bcb76786361e6df4d751b0fbab85
---
# 启动recvData逻辑线程

#### 场景介绍

预先启动接收的逻辑线程，并注册音频和录音的回调对象。


#### 前提条件

指令流引擎对象已创建。


#### 开发流程

1. 封装好逻辑线程对象UpstreamReceiveDispatcher，循环调用指令流引擎的recvData接口。
2. 注册音频数据回调和录音回调函数。
3. 启动逻辑线程。


#### 编码实例

```
public class Activity implements BaseActivity {
   protected void onCreate(Bundle savedInstanceState) {
        upstreamReceiveDispatcher = UpstreamReceiveDispatcher.getInstance();
        upstreamReceiveDispatcher.setInstructionEngine(engine);
        // 音频数据回调
        audioPlayerCallback = new AudioPlayerCallback();
        // 注册音频回调
        upstreamReceiveDispatcher.addNewPacketCallback((byte) InstructionWrapper.AUDIO, audioPlayerCallback);
        // 启动逻辑线程接收音频数据
        upstreamReceiveDispatcher.start();
    }
}
public class UpstreamReceiveDispatcher extends Thread {
    @Override
    public void run() {
        byte[] recvBuf = new byte[MAX_BUF_LEN];
        while (!stopFlag) {
            // 循环调用recvData接收数据
            int packetLen = engine.recvData(mtype, recvBuf, recvBuf.length);
            if (packetLen > 0) {
                byte[] copyData = new byte[packetLen];
                System.arraycopy(recvBuf, 0, copyData, 0, packetLen);
                // 将数据回调给钩子函数
                callback.onNewPacket(copyData);
                continue;
            }
        }
    }
}
```
