我使用retrofit2来处理Android应用程序的网络。我想抽象网络,就像我只做netWorkManager.getsearch()
一样,它做异步请求和UI更新。我见过的所有tutoriels都有,在活动代码中更新@Override onResponse
上的回调中的UI以更新UI(我想在我的networkManager中处理它)。我想传递一个函数或方法来处理Callback的返回,但是我的研究认为这并非不可能。我是否遗漏了使用retrofit2的内容?您是否有任何想法可以解决我的问题或如何在Android中对网络进行良好的抽象?
答案 0 :(得分:0)
这绝对不是不可能,但根据您是使用同步(execute()
)还是异步(enqueue()
)调用而有所不同。
正如您在here所知道的,这就是您处理它们的方式:
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()
}
对于异步调用:
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
}
});
对于像这样定义的服务
public interface RetrofitCarService {
@GET("api/getCars")
Call<List<Car>> getCars();
}
但如果你想抽象它,你可以很容易地做这样的事情
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);
}
}
}
}
然后你就被抽象了:
@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);
}
});
}
请注意,这会强制您的Service
仅为异步,这会导致Call
表示同步和异步操作的能力。如果你想一点,你也可以抽象出Call<T>
。