2014-07-09 16 views
16

Nowa aktualizacja dla systemu Android loopj Async Http lib jest obecnie niedostępna i bardzo się zmieniła. Teraz musisz ręcznie ustawić Looper.prepare() inaczej domyślnie używa trybu synchronicznego zamiast asynchronicznego. Nie dostaję się tam, gdzie muszę to ustawić.Android loopj Async Http ulega awarii po aktualizacji 1.4.5

Logcat

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

Po tym komunikacie to całkowicie rozbija

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 

moja klasa dla żądania 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); 
     } 
} 

Czy ktoś może mi pomóc?

Odpowiedz

0

To dlatego, że ta wersja ma kilka błędów.

Polecam używać warstwy asynchronicznej OkHttp, w zasadzie tej samej struktury.

Lub jeżeli chcesz taką samą strukturę opartą na OkHttpClient (plac Inc) użyj:

https://github.com/leonardoxh/AsyncOkHttpClient

+3

Właśnie znalazłem problem. To z powodu procesu rejestracji GCM. Właśnie zmieniłem Async tak Sync, ponieważ ten proces jest rzeczywiście w AsyncTask, więc nie ma znaczenia, czy to Sync – Phil

+0

Od 1 roku po komentarzu?Myślę, że jesteś szalony. – Leonardo

+0

Zatwierdziłem, ponieważ ta odpowiedź wcale nie jest wyczerpująca. "Masz kilka błędów. Powinieneś zmienić strukturę." Pierwszy wydaje się oczywisty, drugi non sequitur. –

33

miałem podobny problem i okazało się, że uczynienie żądania HTTP z AsyncHttpClient w wątku spowodowało problem .

Uruchomiłem moje żądanie HTTP poza wątkiem i naprawił problem dla mnie. Możesz spróbować czegoś takiego:

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; 
    } 
} 
+0

To zadziałało! Lepsze niż przełączanie biblioteki. –

+0

ale jak właściwie przygotować looper'a i gdzie ustawić, chyba chcemy użyć trybu asynchronicznego – Ravi

+1

Co jeśli nie chcę używać SyncHttpClient? –

12

Nie zgadzam się z tym, co robi Paweł. Chociaż tak naprawdę nie można zobaczyć dobry sposób, aby obejść ten problem jako sposób mam zamiar przedstawić jest dość hacky, jak również, ale zamiast używać AsyncHttpResponseHandler użyć tej klasy zamiast

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

To rozwiązanie sprawdziło się. Próbowałem zainicjować żądanie Async z wątku (który wkrótce umrze). Mam inne wywołania synchroniczne w tym wątku, ale dla tego połączenia chciałem asynchroniczny i dawał mi wyjątek, dopóki nie zastąpiłem wspomnianej metody. Dzięki Tyler. – Rodrigo

+0

proste rozwiązanie ... –

2

I rozwiązać ten problem, przekazanie parametru w AsyncHttpResponseHandler (Looper.getMainLooper()) w ten sposób.

Przede wszystkim użyłem dwóch klas, jedna to Klasa użyteczności i pobierania. W klasie MainActivity używam metody post, która jest implementowana w klasie Download. Następnie klasa Download zawiera funkcję POST(), która została zaimportowana z mojej biblioteki, tak jak 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); 
} 
2

go rozwiązać z jednej linii kodu

ja oddzielone moje responseHandler

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); 
      } 


     } ; 

i to było święty linia

responseHandler.setUsePoolThread(true); 
Powiązane problemy