---
title: 启动recvData逻辑线程
description: "预先启动接收的逻辑线程，并注册音频的回调对象。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2300/armnative/kunpengcpsvideo_16_0021.html
sourcePath: /source/zh/kunpengboostkithistory/2300/armnative/kunpengcpsvideo_16_0021.html
indexId: abea77504f12363e0ec5028d7e72b2d1bab1448b2275759a0dff32519d32974977
---
# 启动recvData逻辑线程

#### 场景介绍

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


#### 前提条件

视频流引擎对象已创建。


#### 开发流程

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


#### 编码实例

```
public class Activity implements BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
upstreamReceiveDispatcher = UpstreamReceiveDispatcher.getInstance();
upstreamReceiveDispatcher.setVideoEngine(engine);
// 音频数据回调
audioPlayerCallback = new AudioPlayerCallback();
// 注册音频回调
upstreamReceiveDispatcher.addNewPacketCallback((byte) VideoWrapper.AUDIO, audioPlayerCallback);
// 启动逻辑线程接收音频数据
upstreamReceiveDispatcher.start();
}
}
public class UpstreamReceiveDispatcher {
@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;
}
}
}
}
```
