- 方式一,wait / notify
示例:WebClient.getInstance().uploadFile方法是一个异步的网络请求接口,上传一个分片文件,
下面代码就通过wait/notify把这个接口的调用改为同步方法;
private boolean mRequestResult = false;
private final Object mRequestSync = new Object();
boolean requestForUploadFile(final String filePath, final long contentOffset, final long contentLength) {
Log.d(TAG, "requestForUploadFile::Start:");
mRequestResult = false;
try {
WebClient.getInstance().uploadFile(mContext, mUploadBean, filePath, contentOffset, contentLength, new RequestListener() {
@Override
public void onSuccess(Response response) {
String contentString = response.getContentString();
Log.d(TAG, "requestForUploadFile::onSuccess: contentString=" + contentString);
mRequestResult = true;
synchronized (mRequestSync) {
mRequestSync .notify();
}
}
@Override
public void onFailure(int errCode, String errMsg) {
Log.d(TAG, "requestForUploadFile::onFailure: errCode=" + errCode +
" errMsg=" + errMsg);
mRequestResult = false;
synchronized (mRequestSync) {
mRequestSync.notify();
}
}
});
synchronized (mRequestSync) {
mRequestSync.wait();
}
} catch (InterruptedException e) {
Log.d(TAG, "requestForUploadFile::InterruptedException:");
e.printStackTrace();
}
Log.d(TAG, "requestForUploadFile::End: mRequestResult =" + mRequestResult );
return mRequestResult ;
}
- 使用 CountDownLatch
private CountDownLatch mRequestLatch;
private boolean mRequestResult = false;
boolean requestForUploadFile(final String filePath, final long contentOffset, final long contentLength) {
Log.d(TAG, "requestForUploadFile::Start:");
mRequestLatch = new CountDownLatch(1);
mRequestResult = false;
try {
WebClient.getInstance().uploadFile(mContext, mUploadBean, filePath, contentOffset, contentLength, new RequestListener() {
@Override
public void onSuccess(Response response) {
String contentString = response.getContentString();
Log.d(TAG, "requestForUploadFile::onSuccess: contentString=" + contentString);
mRequestResult = true;
mRequestLatch.countDown();
}
@Override
public void onFailure(int errCode, String errMsg) {
Log.d(TAG, "requestForUploadFile::onFailure: errCode=" + errCode +
" errMsg=" + errMsg);
mRequestResult = false;
mRequestLatch.countDown();
}
});
mRequestLatch.await();
} catch (InterruptedException e) {
Log.d(TAG, "requestForUploadFile::InterruptedException:");
e.printStackTrace();
}
Log.d(TAG, "requestForUploadFile::End: mVisionRequestResult=" + mVisionRequestResult);
return mRequestResult;
}