Kod 0'dan başka bir şey varsa aboneler için bir istisna oluşturmak istiyorum. Retrofit ve Rx kullanarak nasıl mümkündür?
api.request().flatMap(response -> {
if (response.getCode() != 0) {
return Observable.error(new Exception("Remote error occurred"));
}
return Observable.just(response);
});
ben çok sadece bir kez bu mantığı yazmayı tercih ve güçlendirme tarafından döndürülen tüm gözlenebilirlere uygulanan olurdu:
Bir Observable.flatMap
operatörünü kullanabilirsiniz.
Maalesef
retrofit
ve
rx-java
kullanarak bunu yapmak için bir yol yoktur. Her
retrofit
numaralı çağrı için yukarıdaki kodu yazmak için
numarasına sahip olursunuz. Yapabileceğiniz tek şey,
Observable.compose
yöntemini kullanmak ve yazmak zorunda olduğunuz boilerplate miktarını azaltmaktır.
api.request().compose(new ResponseTransformer<Response>());
Ve burada ResponseTransformer
sınıftır:
public static class ResponseTransformer<T extends Response> implements Observable.Transformer<T, T> {
@Override
public Observable<T> call(final Observable<T> observable) {
return observable.flatMap(response -> {
if (response.getCode() != 0) {
return Observable.error(new Exception("Remote error occurred"));
}
return Observable.just(response);
});
}
}
GÜNCELLEME
Eh, dediğim gibi, orada sadece retrofit
ve rxjava
kullanarak Demirbaş kodu önlemek için hiçbir yolu yoktur, ancak dynamic proxies ile geçici çözüm (compose
aramanıza gerek kalmayacağını unutmayın):
final Api api = restAdapter.create(Api.class);
final ClassLoader loader = api.getClass().getClassLoader();
final Class<?>[] interfaces = api.getClass().getInterfaces();
final Api proxy = (Api) Proxy.newProxyInstance(loader, interfaces, new ResponseInvocationHandler(api));
proxy.request().subscribe(response -> {
System.out.println("Success!");
});
ResponseInvocationHandler
sınıfı:
public static class ResponseInvocationHandler implements InvocationHandler {
private final Object target;
public ResponseInvocationHandler(final Object target) {
this.target = target;
}
@Override
@SuppressWarnings({"unchecked"})
public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
final Object result = method.invoke(target, args);
if (result instanceof Observable) {
return Observable.class.cast(result).compose(new ResponseTransformer<>());
}
return result;
}
}
sayesinde – Nima
çok yararlı o da yapabilirdi, benim güncellenmiş cevabı kontrol @Nima daha da yardımcı olun. –