2017-12-25 16 views
0

내 서버에서 간단한 데이터 목록을 요청하고 있습니다. 나는 개조를 사용하고 있으며 Stetho를 네트워크 인터셉터로 설정하여 네트워크 호출을 모니터링합니다.첫 번째 네트워크 호출이 실패한 이유

enter image description here

당신은 창을 검사 크롬에서이 스크린 샷에서 볼 수 있듯이. 초기 네트워크 호출이 실패한 후 만든 모든 네트워크 호출은 실패하고 자동으로 두 번째 서버를 호출하고 성공합니다. 다음은 네트워크 호출 코드입니다. 네트워크 전화

public void getLocalAreasFromServer(int districtId) { 

     APIService service = ServiceGenerator.createService(APIService.class, this); 
     citiesListCall = service.getCitiesList(districtId); 
     citiesListCall.enqueue(new Callback<List<CityItem>>() { 
      @Override 
      public void onResponse(Call<List<CityItem>> call, Response<List<CityItem>> response) { 
       if (response.isSuccessful()) { 
        ArrayAdapter<CityItem> adapter = new ArrayAdapter<>(InsertAndUpdateAddressActivity.this, 
          android.R.layout.simple_spinner_dropdown_item, response.body()); 
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
        localAreaSpinner.setAdapter(adapter); 

        if(hasExtra){ 
         AddressTable address = getIntent().getParcelableExtra("selected_address"); 

         for(CityItem cityObj: response.body()){ 
          if(cityObj.getCity_name().equals(address.getLocalArea())){ 
           localAreaSpinner.setSelection(adapter.getPosition(cityObj)); 
          } 
         } 
        } 
       } 
      } 

      @Override 
      public void onFailure(Call<List<CityItem>> call, Throwable t) { 
       t.getStackTrace(); 
      } 
     }); 
    } 

API 서비스 인터페이스

public interface APIService { 

    @GET("get_cities_list") 
    Call<List<CityItem>> getCitiesList(@Query("district_id") int district_id); 

} 

ServiceGenerator 클래스

public class ServiceGenerator { 

    private static final String BASE_URL = "https://www.baseURL.com/mobile/"; 

    private static OkHttpClient.Builder httpClient = 
      new OkHttpClient.Builder() 
        .addNetworkInterceptor(new StethoInterceptor()) 
        .connectTimeout(30,TimeUnit.SECONDS) 
        .readTimeout(30,TimeUnit.SECONDS) 
        .addInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Chain chain) throws IOException { 
        Request original = chain.request(); 

        Request request = original.newBuilder() 
          .header("Authorization", "Basic cmdkZXY6cmcxMjM=") 
          .method(original.method(), original.body()) 
          .build(); 

        return chain.proceed(request); 
       } 
      }); 

    private static Retrofit.Builder builder = 
      new Retrofit.Builder() 
        .baseUrl(BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().serializeNulls().create())) 
        .client(httpClient.build()); 

    private static Retrofit retrofit = builder.build(); 

    public static <S> S createService(Class<S> serviceClass, Context context) { 
     Stetho.initializeWithDefaults(context); 
     return retrofit.create(serviceClass); 
    } 
} 
에 대한

기능

디버그를 시도했지만 결코 onFailure 메소드가 나오지 않습니다. 하지만 Logcat에서 벨로우즈 메시지를 볼 수는 있지만 onFailure에서 인쇄되지 않습니다.

java.io.IOException: Address already in use 
at android.net.LocalSocketImpl.bindLocal(Native Method) 
at android.net.LocalSocketImpl.bind(LocalSocketImpl.java:306) 
at android.net.LocalServerSocket.<init>(LocalServerSocket.java:48) 
at com.facebook.stetho.server.LocalSocketServer.bindToSocket(LocalSocketServer.java:142) 
at com.facebook.stetho.server.LocalSocketServer.listenOnAddress(LocalSocketServer.java:78) 
at com.facebook.stetho.server.LocalSocketServer.run(LocalSocketServer.java:74) 
at com.facebook.stetho.server.ServerManager$1.run(ServerManager.java:40) 

내 응용 프로그램이 정상적으로 작동하며 사용자가이를 알지 못합니다. 하지만 내가 뭘 잘못하고 있는지 알아야 해.

답변

0

이 문제는 Github here에보고되었습니다.

이 솔루션은 Proguard와 규칙에 Stetho를 추가 할 수 있습니다 제안 :

-keep class com.facebook.stetho.**{ *; }