Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Both Way_zh

晨鹤 edited this page Dec 19, 2017 · 1 revision

很多时候,我们需要类似 Http 的请求/响应模型来传输数据,或者来确认数据是否已经收到。同时需要有超时判断,当对端一定时间内没有响应时给出反馈。WearTools 很贴心地实现了这种需求。 双向通讯的有关函数与类均在 WTBothway 中。

你需要了解,WTBothway 中的 Request 本质上是发送一个 Message ,而 Response 可以通过实际需求,选择 Message 或 DataMap 进行响应。

发送请求

通过 WTBothway.request() 可以发出请求,并且根据期望的响应类型(Message 或 DataMap)的不同,你应当传入相应的回调。一个回调只能监听到与之相匹配的类型的响应。

下面是一个简单的期望得到 Message 响应的请求 Demo:

String path = "/bothway/msg/test";
String content = "request test";
WTBothway.request(context, path, content, new WTBothway.BothwayCallback() {
	@Override
	public void onRespond(byte[] data) {
		Log.i(TAG, "Receive reply: " + new String(data));
	}

	@Override
	public void onFailed(int resultCode) {
		Log.e(TAG, "Bothway msg failed: " + resultCode);
		//通过判断resultCode可以得知是发送失败还是响应超时。
	}
});

响应请求

普通的 WTMessageListener 或者 Servie 都可以监听到 Bothway 的请求。你可以通过判断参数 bothwayId 是否为 null 确定当前 Message 是一个普通的数据还是一个 Bothway 的请求。 如果是一个 Bothway 的请求,你需要尽快予以 Message 或 DataMap 形式的响应。若响应时间太长,请求方会认为超时,之后收到的响应数据会被直接丢弃。

下面是一个以 Message 形式响应请求的 Demo:

@Override
protected void onMessageReceived(String nodeId, String path, byte[] data, byte[] bothwayId) {
	super.onMessageReceived(nodeId, path, data, bothwayId);
	if (bothwayId != null) { //判断当前是否是一个Bothway的请求
		Log.i(TAG, "Receive bothway request msg: " + new String(data));
		// 发送响应。
		WTBothway.response(context, nodeId, path, bothwayId, "reply for " + new String(data), null);
	}
}

注意: bothwayId 必须原封不动地传给 response 函数,如果经过修改,那么发送方不会收到回调。虽然 path 可以不同,但按照规范也考虑到后续版本兼容性,请务必也原封不动地传给response.

以 DataMap 形式响应请求是大致相同的,不过需要调用 WTBothway.responseDataItem() 函数来实现。

注意: 响应的 DataMap 务必设置 putDataMapRequest.setUrgent();,否则极容易导致超时。

Clone this wiki locally