2017-12-25 33 views
0

私のサーバーからの単純なデータリストを要求しています。私は改造を使用しており、Stethoをネットワークインターセプタとして設定してネットワークコールを監視しています。私の最初のネットワークコールが失敗した理由

enter image description here

あなたはクロムから、このスクリーンショットで見ることができるようにウィンドウを検査します。最初のネットワークコールの後に行ったすべてのネットワークコールは失敗し、自動的に2回目にサーバーを呼び出して成功します。ネットワークコールのコードは次のとおりです。ネットワーク呼び出し

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.**{ *; } 
関連する問題