2016-02-07 6 views
4

Мне нужно использовать syncHttpClient loopj в нескольких областях. Когда я использую AsyncHttpClient, запрос возвращается успешно. Когда я использую SyncHttpClient, как показано в принятом ответе здесь: How to use loopJ SyncHttpClient for synchronous calls?, я ударил точку останова в onFailure. StatusCode является 0, то errorResponse имеет нулевое значение, и Throwable является java.io.IOException: Необработанное исключение: нулевой.IOException при использовании loopj SyncHttpClient

Вот соответствующий код. Опять же, когда я использую Async он работает отлично:

 buttonTest.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
//    AsyncHttpClient httpClient = new AsyncHttpClient(); 
       SyncHttpClient httpClient = new SyncHttpClient(); 

       httpClient.get("http://10.0.1.6:3000/home/test_endpoint", new JsonHttpResponseHandler() { 
        @Override 
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 
         String stringResponse = response.toString(); 
        } 

        @Override 
        public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { 
         String error = errorResponse.toString(); 
        } 
       }); 

       String temp = "got here"; 
      } 
     }); 

Я использую compile 'com.loopj.android:android-async-http:1.4.9'

+0

Убедитесь, что сервер действительно доступен. У вас есть сетевые разрешения? – 323go

+0

добавьте следующую строку внутри onFailure throwable.printstacktrace(); и отобразите logcat здесь. – HourGlass

+0

У меня тоже проблема. – Zapnologica

ответ

1

Вы еще должны запустить его от основного потока. Это код, который работал для меня и позволил мне точки останова установлена ​​на уровне - «Темп Струнный = 'попал сюда» после того, как запрос завершен:

 buttonTest.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       new Thread(new Runnable() { 
        @Override 
        public void run() { 
//      AsyncHttpClient httpClient = new AsyncHttpClient(); 
         SyncHttpClient httpClient = new SyncHttpClient(); 

         httpClient.get("http://10.0.1.6:3000/home/test_endpoint", null, new JsonHttpResponseHandler() { 
          @Override 
          public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 
           String stringResponse = response.toString(); 
          } 

          @Override 
          public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { 
           String error = errorResponse.toString(); 
          } 
         }); 

         String temp = "got here"; 
        } 
       }).start(); 
      } 

Больше код доступен на своей странице GitHub: https://github.com/loopj/android-async-http/blob/master/sample/src/main/java/com/loopj/android/http/sample/SynchronousClientSample.java

+0

Почему это было приостановлено? Должен ли я делать что-то еще? – mikeorr85

0

Я использую AsyncHttpClient, и он работает для меня отлично.

1

Я сделал некоторые отладки, когда я ударил этого, и я обнаружил, что loopj ест следующее исключение:

android.os.NetworkOnMainThreadException 

Я не могу дать подробную трассировку стека, потому что это исключение, кажется, не быть авторизованы правильно (LogCat не собирание его вообще по какой-то причине)

Однако, он находится здесь:

AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:203) 

Я работает мой код, как это:

Handler handler = new Handler(); 
Runnable r = new Runnable(){ 
    public void run(){ 
    SyncHttpClient client .... 
    client.get(.....); // hit error here 
    } 
}; 

Как вы можете видеть, я, случается, работает мой SyncHttpClient в методе Handler.post(), но, по-видимому, что реализация не считается (Networking на неосновного нити)

ключевым моментом, который исправил, было использование «новой темы (...)», в которую был включен код mikeorr85. Подобно этому ...

new Thread(Runnable r = new Runnable(){ 
    public void run(){ 
    SyncHttpClient client .... 
    client.get(.....); // hit error here 
    } 
}).start(); 
+1

Как бы блокировать тогда? Весь смысл «SyncClient» заключается в том, что он не асинхронный. Я хочу сделать сетевой вызов и заблокировать его до тех пор, пока он не будет выполнен? – Zapnologica