Как использовать loopJ SyncHttpClient для синхронных вызовов?

Я застрял на этом в течение двух дней, наконец, решил опубликовать здесь.

Я вижу, что библиотека loopj используется для асинхронных вызовов и содержит множество примеров и объяснений.

Но поскольку я не могу использовать асинхронные вызовы в IntentServe в Android, я вынужден использовать SyncHttpClient, но, похоже, он не работает, поскольку при использовании SyncHttpClient вызывается только обратный вызов onFailure.

В документации также нет примеров использования SyncHttpClient.

Эта проблема также обсуждается здесь.

Так может кто-нибудь дать правильный способ сделать это?


person Sharjeel Ahmed    schedule 28.08.2014    source источник
comment
Какой раствор вы использовали? SyncHttpClient не работает должным образом. Какое решение/подход вы использовали?   -  person Sufian    schedule 27.10.2014
comment
полностью избавился от loopj и использовал простой DefaultHttpClient, который является вызовом синхронизации.   -  person Sharjeel Ahmed    schedule 27.10.2014
comment
К сожалению, я не могу этого сделать, так как мне нужно загрузить файл. Я использовал другой способ. Я опубликую это как ответ. Он отлично работает для меня и, надеюсь, будет полезен для других в будущем.   -  person Sufian    schedule 27.10.2014


Ответы (2)


Вы делаете это так же, как асинхронный 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.
person am7    schedule 03.09.2014

Вы можете использовать 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();
person Sufian    schedule 29.10.2014