2016-04-11 8 views
3

Ich bin neu in Retrofit Library. Ich arbeite an einer App, in der ich mehrere API-Aufrufe machen muss, aber dieses Problem hält mich fest, wenn ich versuchte, meine erste API-Aufruf ...Retrofit 2 Enqueue-Methode läuft 2 Mal

Ich bin mit dem Problem konfrontiert, dass, wann immer ich Retrofit rief Asynchronous Call-Methode dann die Funktionalität innerhalb onResponse Methode ausgeführt wird 2 mal ...

Dies ist mein Code, wenn ich die API-Aufruf asynchron nenne ...

final ApiModule apiService = ApiServiceGenerator.createService(ApiModule.class); 
Call <ConfigResponse> call = apiService.getConfig(); 

call.enqueue(new Callback<ConfigResponse>() { 
    @Override 
    public void onResponse(Call<ConfigResponse> call, Response<ConfigResponse> response) { 
    try { 
     if (response.isSuccessful()) { 
      Log.e("MyTag", "This is running"); 
     } 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    @Override 
    public void onFailure(Call<ConfigResponse> call, Throwable t) { 
    e.printStackTrace(); 
    } 
}); 

sobald ich die App laufen auf Das Gerät und wenn ich den Logger meines Android-Studios sehe, zeigt er mir die Log-Nachricht als -

E/MyTag: This is running 
E/MyTag: This is running 

Es scheint hier, dass es für 2 mal läuft .. !!

Ich kann nicht verstehen, warum es 2 mal läuft. Bitte helfen Sie mir dabei ...

Nur für weitere Hilfe ... Ich habe meinen Code so implementiert.

ApiModule Interface (wo ich meine API-Aufruf URLs definiert)

public abstract interface ApiModule { 

    @GET("config") 
    Call<ConfigResponse> getConfig(); 

} 

ApiServiceGenerator so geht -

public class ApiServiceGenerator { 

public static final String API_BASE_URL = "https://www.example.com/"; 
private static OkHttpClient httpClient = new OkHttpClient.Builder() 
     .addInterceptor(new Interceptor() { 
      @Override 
      public okhttp3.Response intercept(Chain chain) throws IOException { 
       Request newRequest = chain.request().newBuilder().addHeader("App-Secret", "some-secret-key").build(); 
       return chain.proceed(newRequest); 
      } 
     }) 
     .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) // Just For logging 
     .readTimeout(60, TimeUnit.SECONDS) 
     .connectTimeout(60, TimeUnit.SECONDS) 
     .build(); 

Gson gson = new GsonBuilder() 
     .registerTypeAdapterFactory(new ArrayAdapterFactory()) 
     .create(); 

private static Retrofit.Builder builder = 
     new Retrofit.Builder() 
       .baseUrl(API_BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().registerTypeAdapterFactory(new ArrayAdapterFactory()).create())); 

public static <S> S createService(Class<S> serviceClass) { 
    Retrofit retrofit = builder.client(httpClient).build(); 
    return retrofit.create(serviceClass); 
} 

public static Retrofit retrofit() { // For Error Handing when non-OK response is received from Server 
    OkHttpClient httpClient = new OkHttpClient.Builder().build(); 
    OkHttpClient client = httpClient; 
    return builder.client(client).build(); 
} 
} 

Antwort

3

Schließlich beschloß ich, mein Problem .. Es ist nicht das Problem der Retrofit-Bibliothek .. !!

Eigentlich ist es mein schlechtes. Ich öffne das Fragment zweimal (was ich nicht kenne, bevor ich diese Frage beantworte) ... Deshalb läuft der Code innerhalb des Fragments zweimal, was mich denken lässt, wie die Nachrüstantwort zweimal ausgeführt wird ...

+0

gibt es ein anderes Problem Ich lief auf das genaue Problem, aber es passierte, dass der Enqueue-Aufruf wurde 2 mal direkt aufgerufen. Dennoch kann keine andere direkte Ursache gefunden werden. Ich suche nach einer anderen Lösung, die diese Version 2.3.0 Version lösen kann. – GFxJamal