Promise的应用
Cruzr 大部分接口都提供了同步调用方式与异步调用方式,开发者可以根据不同场景灵活选用接口的调用方式。
Promise
Promise 是Cruzr 处理同步异步的一种方式,通过 Promise 设置监听实现接口异步调用,同时,通过 get 方法可以实现接口的同步方式。 Promise 的所有方法如下所示:
| 方法 | 说明 |
|---|---|
| Promise.isPending() | 当前是否处于等待结果状态 |
| Promise.isResolved() | 当前是否处于已经完成状态 |
| Promise.isCanceled() | 当前是否处于取消请求状态 |
| Promise.isRejected() | 当前是否处于请求失败状态 |
| Promise.cancel() | 取消请求 |
| Promise.cancelled(CancelledCallback callback) | 设置请求取消回调 |
| Promise.done(DoneCallback<? super D> callback) | 设置请求完成结果回调 |
| Promise.fail(FailCallback<? super F> callback) | 设置请求失败结果回调 |
| Promise.always(AlwaysCallback<? super D, ? super F> callback) | 设置请求结束回调,不论是否成功、失败或者取消 |
| Promise.get() | 同步获取请求结果,该方法会阻塞执行 |
| Promise.getInterruptibly(long timeout, TimeUnit unit) | 同步获取请求结果, 支持设置等待时间 |
| Promise.getFail() | 获取失败原因,该方法不会阻塞,只有失败后才会有具体值 |
对于部分有进度反馈的接口,Promise 子类 ProgressivePromise 提供了设置监听进度回调
| 方法 | 说明 |
|---|---|
| ProgressivePromise.progress(ProgressCallback<? super P> callback) | 设置请求进度回调 |
注:Promise所有回调均在主线程
异步调用
即非阻塞调用,异步调用通过接口返回的 Promise 对象设置回调监听完成。
单次回调
Promise<UnderstandingResult, UnderstandingException> promise = speechManager.understand("what's the weather."); promise.done(new DoneCallback<UnderstandingResult>() { @Override public void onDone(UnderstandingResult understandingResult) { // 调用结果会返回到此处 } });
多次回调
部分接口带有进度反馈,可以通过 ProgressivePromise.progress()接收进度通知。
ProgressivePromise<RecognitionResult, RecognitionException, RecognitionProgress> progressivePromise = speechManager.recognize(); progressivePromise.progress(new ProgressCallback<RecognitionProgress>() { @Override public void onProgress(RecognitionProgress recognitionProgress) { // 调用过程会多次通知进度到此处 } }).done(new DoneCallback<RecognitionResult>() { @Override public void onDone(RecognitionResult recognitionResult) { // 调用结果会返回到此处 } }) ;
取消执行
取消请求只需要 promise 的 cancel方法即可, 并且会通知到 CancelledCallback
promise.cancel();
处理异常
promise.fail(new FailCallback<UnderstandingException>() { @Override public void onFail(UnderstandingException e) { // 调用异常会通知到此处 } });
同步调用
同步调用同样是通过 Promise 完成,与异步调用不同,同步调用的失败以及取消等操作将会以异常的形式通知,同样以调用语音识别为例,方法如下:
try { ProgressivePromise<RecognitionResult, RecognitionException, RecognitionProgress> progressivePromise = speechManager.recognize(); RecognitionResult result = progressivePromise.get();// 此处会阻塞到结果返回或者异常 } catch (RecognitionException e) { e.printStackTrace();// [1] } catch (CancelledException e) { e.printStackTrace();// [2] }
[1] 请求失败会抛出对应的异常
[2] 请求被取消执行会抛出 CancelledException
注:同步调用为阻塞方法,请避免在主线程使用, 并且无法获取进度的通知