Android 如何使用loopJ SyncHttpClient进行同步调用?

Android 如何使用loopJ SyncHttpClient进行同步调用?,android,http,service,loopj,Android,Http,Service,Loopj,我已经坚持了两天了,终于决定在这里发布 我看到loopj库被用于异步调用,并且有很多例子和解释 但由于我无法在Android的IntentDrive中使用异步调用,我被迫使用SyncHttpClient,但它似乎不起作用,因为在我使用SyncHttpClient时,只调用onFailure回调 文档中也没有使用SyncHttpClient的示例 对这一问题也进行了讨论 那么,有人能给出正确的方法吗?您可以使用与异步http客户端相同的方法,提供实现ResponseHandlerInterface

我已经坚持了两天了,终于决定在这里发布

我看到loopj库被用于异步调用,并且有很多例子和解释

但由于我无法在Android的IntentDrive中使用异步调用,我被迫使用SyncHttpClient,但它似乎不起作用,因为在我使用SyncHttpClient时,只调用onFailure回调

文档中也没有使用SyncHttpClient的示例

对这一问题也进行了讨论


那么,有人能给出正确的方法吗?

您可以使用与异步http客户端相同的方法,提供实现ResponseHandlerInterface的处理程序,但现在请求将在同一线程中执行。通过将调试器设置为sync 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.

您可以使用
SyncHttpClient
,但您没有取消它的选项。我制作了一个类,它使用
AsyncHttpClient
上传文件,但它比
SyncHttpClient
类有优势-它允许取消。我已经把代码发进去了

来自同一线程的代码:

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

你用了什么解决方案
SyncHttpClient
似乎无法正常工作。您使用了什么解决方案/方法?完全摆脱了loopj,使用了简单的DefaultHttpClient,这是一个同步调用。不幸的是,我不能这样做,因为我必须上传一个文件。我用了另一种方法。我将把它作为一个答案发布。这对我来说很好,希望将来能对其他人有所帮助。