我滚动浏览官方
documentation的Retrofit并决定在我的项目中实现类似的东西,这样用户总是可以选择取消下载文件,一切都能正常工作.实施适当的方法,如果未能规定以下内容:
service.upload1(file1,str,stringMap,new Callback<ImageUpload>() { @Override public void success(final ImageUpload imageUpload,Response response) { mRecyclerView.post(new Runnable() { @Override public void run() { ... }); } @Override public void failure(RetrofitError error) { if (error.isCanceled()) { Log.e(TAG,"request is cancelled"); } else { Log.e(TAG,"other larger issue,i.e. no network connection?"); } }
但是红色的下划线是失败的方法.我不明白是什么问题,因为这个方法我们最初提出类Call(也许是因为发誓我而不是类Call是RetrofitError?)请告诉我如何修复.
我使用改装1.9,我不需要继续改造2.
解决方法
就记忆而言,error.isCanceled()似乎并没有出现在Retrofit中.如果你想能够取消一个请求,你可以切换到他们有call.cancel()方法的Retrofit 2,或者在当前版本的Retrofit中,你可以扩展Callback类来创建你自己的类CancellableCallback,就像这样:
public class CancellableCallback<T> implements Callback<T> { private Callback<T> callback; private boolean canceled; private CancellableCallback() {} public CancellableCallback(Callback<T> callback) { this.callback = callback; canceled = false; } public void cancel() { canceled = true; callback = null; } @Override public void success(T o,Response response) { if (!canceled) { callback.success(o,response); } } @Override public void failure(RetrofitError error) { if (!canceled) { callback.failure(error); } } }
编辑
然后你可以像这样使用它:
CancellableCallback callback = new Callback<ImageUpload>() { @Override public void success(final ImageUpload imageUpload,Response response) { mRecyclerView.post(new Runnable() { @Override public void run() { ... }); } @Override public void failure(RetrofitError error) { } }; service.upload1(file1,callback);
然后像这样取消它:
if (some condition && callback != null) { callback.cancel(); }