与loopj Android异步Http客户端同步进行调用

与loopj Android异步Http客户端同步进行调用,android,loopj,Android,Loopj,我试图在loopj上使用setUseSynchronousMode来等待http调用的结果,然后在一种情况下继续。我试过: AsyncHttpResponseHandler responseHandler = new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] response) {

我试图在loopj上使用setUseSynchronousMode来等待http调用的结果,然后在一种情况下继续。我试过:

    AsyncHttpResponseHandler responseHandler = new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] response) {
            Log.d("TEST", "Got results");
        }
    };

    AsyncHttpClient client = new AsyncHttpClient();
    responseHandler.setUseSynchronousMode(true);
    client.get("http://www.google.com", responseHandler);
    Log.d("TEST", "Don't want to get here until after getting results");
但结果是:

07-11 19:48:05.631 D/TEST﹕ Don't want to get here until after getting results
07-11 19:48:05.814 D/TEST﹕ Got results

我是否误解了setUseSynchronousMode应该做什么?

您应该使用
SyncHttpClient
而不是
AsyncHttpClient
setUseSynchronousMode
对于
AsyncHttpClient

没有预期的效果。要使
AsyncHttpClient
的同步版本能够取消它,我在主线程上执行所有操作。以前我在
AsyncTask
中运行它,只要调用
AsyncHttpClient.post()
AsyncTask
就会完成,我无法跟踪
AsyncHttpClient
实例

SyncHttpClient
不允许我取消上载,因此我知道我必须使用
asynchtpclient
并进行适当的更改

下面是我上传一个使用
AsyncHttpClient
并允许取消的文件的类:

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();

无论同步模式是否这样做,它都不是您应该做的事情。它会冻结你的整个UI线程,使手机没有响应。HTTP请求必须在另一个线程上完成,这是有原因的,不要试图解决它。@Gabe Sechan,我不是在UI线程上调用它。你能分享一个示例代码吗
SyncHttpClient
似乎没有阻止它正在运行的线程,这阻止了我取消请求。首先,我确实使用了带回调的AsyncHttpClient,因为这确实是一种更干净的方法,所以您可能需要考虑更多关于这样做的方法。但我认为如果您使用SyncHttpClient(可能需要调用responseHandler.setUseSynchronousMode(true))也应该可以工作。我并不奇怪它不支持取消请求。