Ich benutze Retrofit2, um das Netzwerk einer Android App zu behandeln. Ich möchte das Netzwerk abstrahieren, wie ich nur netWorkManager.getsearch()
mache und es die asynchrone Anfrage und das UI-Update mache. Alle Tutorials, die ich gesehen habe, haben den Code zur Aktualisierung der Benutzeroberfläche im Callback auf dem @Override onResponse
im Code der Aktivität, um die Benutzeroberfläche zu aktualisieren (und ich möchte das in meinem NetworkManager behandeln). Ich wollte eine Funktion oder eine Methode übergeben, um die Rückgabe des Callbacks zu bewältigen, aber mit meinen Recherchen denke ich, dass es nicht unmöglich ist. Fehle ich etwas an der Verwendung von Retrofit2? Hattest du irgendwelche Ideen, um mein Problem zu lösen oder eine gute Abstraktion des Netzwerks in Android zu machen?Retrofit2 Abstraktionsnetzwerk Android
0
A
Antwort
0
Es ist definitiv nicht unmöglich, obwohl es davon abhängt, ob Sie den synchronen (execute()
) oder asynchronen (enqueue()
) Aufruf verwenden.
Wie Sie aus here wissen, ist dies, wie Sie mit ihnen umgehen:
Call<List<Car>> carsCall = carInterface.loadCars();
try {
Response<List<Car>> carsResponse = carsCall.execute();
} catch (IOException e) {
e.printStackTrace();
//network Exception is thrown here
}
if(carsResponse != null && !carsResponse.isSuccess() && carsReponse.errorBody() != null){
// handle carsResponse.errorBody()
}
Für Asynchron-Anrufe:
Call<List<Car>> call = service.loadCars();
call.enqueue(new Callback<List<Car>>() {
@Override
public void onResponse(Response<List<Car>> response) {
// Get result from response.body(), headers, status codes, etc
}
@Override
public void onFailure(Throwable t) {
//handle error
}
});
Für einen Dienst definiert wie so
public interface RetrofitCarService {
@GET("api/getCars")
Call<List<Car>> getCars();
}
Aber wenn Sie möchten es abstrahieren, könnten Sie einfach so etwas tun
public interface YourCallback<T> {
void onSuccess(T t);
void onError(Throwable throwable);
}
public interface CarService {
void getCars(YourCallback<List<Car>> callback);
}
public class CarServiceImpl implements CarService {
private RetrofitCarService retrofitCarService;
public CarServiceImpl(RetrofitCarService retrofitCarService) {
this.retrofitCarService = retrofitCarService;
}
public void getCars(YourCallback<List<Car>> callback) {
retrofitCarService.getCars().enqueue(new Callback<List<Car>>() {
@Override
public void onResponse(Response<List<Car>> response) {
callback.onSuccess(response.body());
}
@Override
public void onFailure(Throwable t) {
callback.onError(t);
}
}
}
}
Und dann werden Sie weg abstrahiert werden:
@Inject
CarService carService;
public void something() {
carService.getCars(new YourCallback<List<Car>>() {
public void onSuccess(List<Car> cars) {
refreshDataSet(cars);
}
public void onError(Throwable throwable) {
showError(throwable);
}
});
}
Bitte beachten Sie, dass dies jedoch Ihre Service
nur Asynchron zwingen würde, die die Fähigkeit von Call
s wegwirft sowohl synchron und asynchron zu vertreten Operationen. Wenn Sie ein wenig nachdenken, können Sie aber auch weg abstrahieren Call<T>
.