我已经被困在这两天了,最后决定在这里发帖。
我看到loopj库用于异步调用,并提供了大量示例和解释。
但由于我不能在Android中的IntentSerive中使用异步调用,我被迫使用SyncHttpClient,但它似乎不起作用,因为当我使用SyncHttpClient时只调用onFailure回调。
在文档中也没有使用SyncHttpClient的示例。
此问题也在讨论here。
那么有人能给出正确的方法吗?
答案 0 :(得分:7)
您以与async http客户端相同的方式执行此操作,您提供了实现ResponseHandlerInterface的处理程序,但现在请求将在同一个线程中执行。您可以通过在同步http客户端调用后将调试器设置为下一个语句来自行检查,并在执行onSuccess / onFailure回调后看到调试器将命中此语句。在异步调试器的情况下,甚至在你的onStart方法之前就会遇到这种情况,因为它将在一个单独的线程中执行。
示例:
mSyncClient.post("http://example.com", params, new JsonHttpResponseHandler() {
@Override
public void onStart() {
// you can do something here before request starts
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// success logic here
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable e, JSONObject errorResponse) {
// handle failure here
}
});
// the statements after this comment line will be executed after onSuccess (or onFailure ) callback.
答案 1 :(得分:0)
您可以使用SyncHttpClient
,但您无法取消该选项。我创建了一个使用AsyncHttpClient
上传文件的课程,但它比SyncHttpClient
课程有优势 - 它允许取消。我已经在other thread发布了代码。
来自同一线程的代码:
public class AsyncUploader {
private String mTitle;
private String mPath;
private Callback mCallback;
public void AsyncUploader(String title, String filePath, MyCallback callback) {
mTitle = title;
mPath = filePath;
mCallback = callback;
}
public void startTransfer() {
mClient = new AsyncHttpClient();
RequestParams params = new RequestParams();
File file = new File(mPath);
try {
params.put("title", mTitle);
params.put("video", file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mClient.setTimeout(50000);
mClient.post(mContext, mUrl, params, new ResponseHandlerInterface() {
@Override
public void sendResponseMessage(HttpResponse response) throws IOException {
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
// TODO convert instream to JSONObject and do whatever you need to
mCallback.uploadComplete();
}
}
@Override
public void sendProgressMessage(int bytesWritten, int bytesTotal) {
mCallback.progressUpdate(bytesWritten, bytesTotal);
}
@Override
public void sendFailureMessage(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
mCallback.failedWithError(error.getMessage());
}
});
}
/**
* Cancel upload by calling this method
*/
public void cancel() {
mClient.cancelAllRequests(true);
}
}
这是你如何运行它:
AsyncUploader uploader = new AsyncUploader(myTitle, myFilePath, myCallback);
uploader.startTransfer();
/* Transfer started */
/* Upon completion, myCallback.uploadComplete() will be called */
要取消上传,只需拨打cancel()
,如:
uploader.cancel();