android - studio - ¿Cómo usar loopJ SyncHttpClient para llamadas sincrónicas?
http post android studio (2)
Estuve atascado en esto durante dos días, finalmente decidí publicar aquí.
Veo que la biblioteca loopj se usa para llamadas asincrónicas y con muchos ejemplos y explicaciones.
Pero como no puedo usar llamadas asincrónicas en IntentSerive en Android, estoy forzado a usar SyncHttpClient, pero parece que no funciona, ya que solo se llama a la devolución de llamada onFailure cuando uso SyncHttpClient.
No hay ejemplos de uso de SyncHttpClient también en la documentación.
Este problema también se discute aquí .
Entonces, ¿alguien puede dar la forma correcta de hacerlo?
Lo hace de la misma manera que el cliente http asincrónico, proporciona su controlador que implementa ResponseHandlerInterface, pero ahora la solicitud se ejecutará dentro del mismo hilo. Puede verificarlo usted mismo fácilmente configurando el depurador en la siguiente instrucción después de su llamada de sincronización http cliente y ver que el depurador llegará a esta declaración después de la ejecución de la devolución de llamada onSuccess / onFailure. En caso de que el depurador asíncrono lo haga incluso antes de su método onStart, porque se ejecutará en un hilo separado.
Ejemplo:
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.
Puede usar SyncHttpClient
pero no tendrá la opción de cancelarlo. Hice una clase que utiliza AsyncHttpClient
para cargar archivos, pero tiene una ventaja sobre la clase SyncHttpClient
: permite la cancelación. Ya he publicado el código en otro hilo .
Código del mismo hilo:
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);
}
}
Así es como puedes ejecutarlo:
AsyncUploader uploader = new AsyncUploader(myTitle, myFilePath, myCallback);
uploader.startTransfer();
/* Transfer started */
/* Upon completion, myCallback.uploadComplete() will be called */
Para cancelar la carga, simplemente llame a cancel()
como:
uploader.cancel();