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

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

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

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

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

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

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

Вы делаете это так же, как async http client, вы предоставляете обработчик, который реализует ResponseHandlerInterface, но теперь запрос будет выполнен в том же потоке. Вы можете легко убедиться в этом, установив отладчик на следующий оператор после вашего вызова http-клиента синхронизации и увидите, что отладчик ударит по этому утверждению после выполнения обратного вызова onSuccess / onFailure. В случае, если отладчик async ударит его еще до вашего метода 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(); 
Intereting Posts
Анимация фрагмента 3-х панелей заикается Значок значка «Серая коробка» Консоль разработчика Google Play Как установить значок приложения в качестве значка уведомления в ящике уведомлений Вложенные фрагменты теряют вызовы onCreateOptionsMenu после вращения экрана Как текстовый фильтр Android ListView, поддерживаемый SimpleCursorAdapter? Полноэкранный макет в списке прокрутки Авторизовать Android-игру – Где приложение-идентификатор? Fclose работает по-разному на Android и Linux Запуск активности из оповещения разрушает родительскую активность Автоматизация развертывания в консоли разработчика Android Вид родительского дна скрывается с макетом родительского центра на открывающей клавиатуре Youtube YouTubePlayerSupportFragment работает неправильно (загрузка всегда?) Переходите к Как найти доступные ограничения приложения для DevicePolicyManager.setApplicationRestrictions Запуск намерения SMS-сообщения больше не работает для новой операционной системы Droid RAZR ICS