Я застрял на этом в течение двух дней, наконец, решил разместить здесь.
Я вижу, что библиотека 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();