volley msebera jsonhttpresponsehandler example async java android asynchronous httprequest loopj

java - msebera - Android loopj Async Http se bloquea después de la actualización 1.4.5



import cz msebera android httpclient client httpclient (5)

La nueva actualización para Android loopj Async Http lib está fuera y han cambiado mucho. Ahora necesita configurar manualmente Looper.prepare() contrario, utiliza el modo sincronizado en lugar de asíncrono de forma predeterminada. No llego a donde necesito configurarlo.

Logcat

07-09 08:16:18.775: W/AsyncHttpResponseHandler(6606): Current thread has not called Looper.prepare(). Forcing synchronous mode.

Después de ese mensaje se bloquea totalmente.

07-09 08:16:18.835: E/AndroidRuntime(6606): FATAL EXCEPTION: AsyncTask #1 07-09 08:16:18.835: E/AndroidRuntime(6606): java.lang.RuntimeException: An error occured while executing doInBackground() 07-09 08:16:18.835: E/AndroidRuntime(6606): at android.os.AsyncTask$3.done(AsyncTask.java:278) 07-09 08:16:18.835: E/AndroidRuntime(6606): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 07-09 08:16:18.835: E/AndroidRuntime(6606): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 07-09 08:16:18.835: E/AndroidRuntime(6606): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 07-09 08:16:18.835: E/AndroidRuntime(6606): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 07-09 08:16:18.835: E/AndroidRuntime(6606): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 07-09 08:16:18.835: E/AndroidRuntime(6606): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 07-09 08:16:18.835: E/AndroidRuntime(6606): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 07-09 08:16:18.835: E/AndroidRuntime(6606): at java.lang.Thread.run(Thread.java:864) 07-09 08:16:18.835: E/AndroidRuntime(6606): Caused by: java.lang.IllegalArgumentException: Synchronous ResponseHandler used in AsyncHttpClient. You should create your response handler in a looper thread or use SyncHttpClient instead. 07-09 08:16:18.835: E/AndroidRuntime(6606): at com.loopj.android.http.AsyncHttpClient.sendRequest(AsyncHttpClient.java:1096) 07-09 08:16:18.835: E/AndroidRuntime(6606): at com.loopj.android.http.AsyncHttpClient.post(AsyncHttpClient.java:873) 07-09 08:16:18.835: E/AndroidRuntime(6606): at com.loopj.android.http.AsyncHttpClient.post(AsyncHttpClient.java:856) 07-09 08:16:18.835: E/AndroidRuntime(6606): at com.loopj.android.http.AsyncHttpClient.post(AsyncHttpClient.java:843) 07-09 08:16:18.835: E/AndroidRuntime(6606): at com.xxx.app.HttpRequestGCM.post(HttpRequestGCM.java:15) 07-09 08:16:18.835: E/AndroidRuntime(6606): at com.xxx.app.ChatActivity$RegisterBackground.sendRegistrationIdToBackend(ChatActivity.java:681) 07-09 08:16:18.835: E/AndroidRuntime(6606): at com.xxx.app.ChatActivity$RegisterBackground.doInBackground(ChatActivity.java:660) 07-09 08:16:18.835: E/AndroidRuntime(6606): at com.xxx.app.ChatActivity$RegisterBackground.doInBackground(ChatActivity.java:1) 07-09 08:16:18.835: E/AndroidRuntime(6606): at android.os.AsyncTask$2.call(AsyncTask.java:264) 07-09 08:16:18.835: E/AndroidRuntime(6606): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 07-09 08:16:18.835: E/AndroidRuntime(6606): ... 5 more

Mi clase para la solicitud Http:

import android.os.Looper; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.PersistentCookieStore; import com.loopj.android.http.RequestParams; public class HttpRequest { public static AsyncHttpClient client = new AsyncHttpClient(); public static void setCookieStore(PersistentCookieStore cookieStore) { client.setCookieStore(cookieStore); } public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { Looper.prepare(); client.get(url, params, responseHandler); } public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { Looper.prepare(); client.post(url, params, responseHandler); } }

¿Alguien puede ayudarme?


Es porque esta versión tiene varios errores.

Le recomiendo que utilice la capa asíncrona OkHttp, es básicamente la misma estructura.

O si quieres la misma estructura basada en OkHttpClient (Square Inc) usa esto:

https://github.com/leonardoxh/AsyncOkHttpClient


Lo resuelvo con una sola línea de código.

Separé mi respuestaHandler

JsonHttpResponseHandler responseHandler = new JsonHttpResponseHandler(){ @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { RecorridoResponseDTO respuesta= new Gson().fromJson(response.toString(), RecorridoResponseDTO.class); recorrido.setRecorridoId(respuesta.getA()); mDataManager.actualizarRecorrido(recorrido); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); } } ;

y esta era la línea santa

responseHandler.setUsePoolThread(true);


No estoy de acuerdo con hacerlo a la manera de Paul. Aunque realmente no puedo ver una buena manera de evitar esto, ya que la forma en que estoy a punto de presentar es bastante intrépida también, pero en lugar de usar AsyncHttpResponseHandler use esta clase

public abstract class AlwaysAsyncHttpResponseHandler extends AsyncHttpResponseHandler { @Override public boolean getUseSynchronousMode() { return false; } }


Resolví el problema al pasar el parámetro en AsyncHttpResponseHandler (Looper.getMainLooper ()) de esta manera.

Primero que todo, utilicé dos clases, una es MainActivity y Download Class. En la clase MainActivity, llamo al método post que se implementa en la clase de descarga. Luego, la clase de descarga contiene POST () que se importó de mi biblioteca como import com.loopj.android.http. *;

MainActivity.Class

clientObj.post(context,url,entity, "application/json", new AsyncHttpResponseHandler(Looper.getMainLooper()) { @Override public void onSuccess(int statusCode,org.apache.http.Header[] headers,byte[] responseBody) { System.out.println(" Success ="+responseBody); } @Override public void onFailure(int statusCode,org.apache.http.Header[] headers,byte[] responseBody, Throwable error) { System.out.println( "Failure"); } });

DownLoad.Class

AsyncHttpClient asynClient = new AsyncHttpClient(); void post(Context context,String url, StringEntity entity,String string, AsyncHttpResponseHandler asyncHttpResponseHandler) { asynClient.addHeader("Accept", "application/json"); asynClient.addHeader("Content-type", "application/json"); asynClient.post(context, url, entity, "application/json", asyncHttpResponseHandler ); }


Tuve un problema similar y encontré que al hacer solicitudes HTTP con un AsyncHttpClient en un hilo causó el problema.

Ejecuté mi solicitud HTTP fuera del hilo y solucioné el problema. Puedes probar algo como:

public class HttpRequest { // A SyncHttpClient is an AsyncHttpClient public static AsyncHttpClient syncHttpClient= new SyncHttpClient(); public static AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); public static void setCookieStore(PersistentCookieStore cookieStore) { getClient().setCookieStore(cookieStore); } public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { getClient().get(url, params, responseHandler); } public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { getClient().post(url, params, responseHandler); } /** * @return an async client when calling from the main thread, otherwise a sync client. */ private static AsyncHttpClient getClient() { // Return the synchronous HTTP client when the thread is not prepared if (Looper.myLooper() == null) return syncHttpClient; return asyncHttpClient; } }