2017-10-25 5 views
0

Ich erweitere den Standard-Retrofit 2 Rückruf:Retrofit Individueller Rückruf Allgemein Typen

abstract class APICallback<T> implements Callback<T> { 

    @Override 
    public void onResponse(Call<T> call, Response<T> response) { 
     if (!response.isSuccessful()) { 
      // Cast response.body() to my POJO class, results in null 
      MyClass myClass = (MyClass) response.body(); 
     } 
    } 

    @Override 
    public void onFailure(Call<T> call, Throwable t) { 
     // TODO ... 
    } 
} 

Wie kann ich die niedergeschlagene Gattung des Antwort auf meine eigene Klasse? Sollte dieser Prozess automatisch sein? Ich verwende GsonConverter für den Client.

Antwort

1

Ersetzen T mit MyClass

class APICallback implements Callback<MyClass> { 

    @Override 
    public void onResponse(Call<MyClass> call, Response<MyClass> response) { 
     if (response.isSuccessful()) { 
      // Cast response.body() to my POJO class, results in null 
      MyClass myClass = response.body(); 
     } 
    } 

    @Override 
    public void onFailure(Call<MyClass> call, Throwable t) { 

    } 
} 
+0

Ich kann das nicht, ich bin eine generische Art zu überschreiben. – Jumpa

+0

entfernen Sie abstrakt & "!" (Response.isSuccessful()), verwenden Sie über aktualisierten Code funktioniert gut – Gautam

+0

überprüfen Sie bitte die Antwort, die ich unter –

0

Sie von diesem

Gson gson = new Gson(); 
MyClass myClass = gson.fromJson(response.body(), MyClass.class); 
+0

bieten Sollte dies nicht automatisch über den GsonConverter Ich habe die Retrofit-Setup hinzugefügt? – Jumpa

+0

Nein. Sie müssen dies in Gradle Abhängigkeit hinzufügen und Sie sollten JsonElement anstelle Ihrer Klasse in Antwort schreiben Antwort –

+0

kompilieren 'com.google.code.gson: gson: 2.7' –

0

denken verarbeiten kann ich das Ihnen helfen würde .....

ApiCalls api = retrofit.create(ApiCalls.class); 

Call<User> call = api.getDataFromServer(StringConstants.URL,hashMap); 

callRetrofit(call,1); 

public static <T> void callRetrofit(Call<T> call,final int i) { 

     call.enqueue(new Callback<T>() { 
      @Override 
      public void onResponse(Call<T> call, Response<T> response) { 
      if(i==1){ 
        User user = (User) response.body(); // use the user object for the other fields 
      }else if (i==2){ 
       Patient user = (Patient) response.body(); 
       } 


      } 

      @Override 
      public void onFailure(Call<T> call, Throwable t) { 

      } 
     }); 

    } 

Hoffe das würde geben Ihnen einige Tipps .....

More Information ....

0

Ich glaube, Sie ändern müssen Adapterfactory und dann registrieren Retrofit

public class APICallAdapterFactory extends CallAdapter.Factory { 

@Nullable 
@Override 
public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { 
    final Type responseType = ((ParameterizedType) returnType).getActualTypeArguments()[0]; 
    return new CallAdapter<Object, Object>() { 
     @Override 
     public Type responseType() { 
      return responseType; 
     } 

     @Override 
     public Object adapt(Call<Object> call) { 
      return new APICallAdapter<>(call); 
     } 
    }; 
} 

und

private static Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(APIService.baseUrl) 
     .client(client) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .addCallAdapterFactory(new APICallAdapterFactory()) 
     .build(); 

Wenn Sie info mehr

Siehe diesen Link

https://blogdeveloperspot.blogspot.com/2017/11/retrofit-20-custom-featrealm-gson.html

Ich hoffe, es nützlich für Sie :)

+0

Fügen Sie eine Zusammenfassung des Links hier und demonstrieren mit einigen Beispielcode. – Satendra

+0

Okay, ich habe es behoben :) @Satendra – Taz