Android 在自定义Runnable中使用改装执行请求
我正在使用Android 在自定义Runnable中使用改装执行请求,android,threadpoolexecutor,retrofit,Android,Threadpoolexecutor,Retrofit,我正在使用改型从Volley迁移到自定义实现,但我正在尝试向我的实现中添加一些我喜欢的Volley特性,例如 RequestQueue.cancel(字符串标记) 如果请求具有请求的标记,则通过将布尔值mCanceled设置为true来取消该请求。run方法检查此值并返回是否为真。 为了能够通过改型重现这一点,我应该能够使用实现可运行的自定义类,而不是默认类,其中有一个mTag和一个mCanceled字段。 此外,Volley还能够在活动的线程内设置这样的标志,并立即停止它们。我已经实现了我的c
改型
从Volley
迁移到自定义实现,但我正在尝试向我的实现中添加一些我喜欢的Volley
特性,例如
RequestQueue.cancel(字符串标记)
如果请求
具有请求的标记,则通过将布尔值mCanceled
设置为true来取消该请求。run
方法检查此值并返回是否为真。
为了能够通过改型
重现这一点,我应该能够使用实现可运行
的自定义类,而不是默认类,其中有一个mTag
和一个mCanceled
字段。
此外,Volley
还能够在活动的线程
内设置这样的标志,并立即停止它们。我已经实现了我的cancelAll
方法,它只是将队列排入另一个队列,但无法访问活动线程。
使用翻新
和线程池执行器
是否可能达到相同的结果?我想我找到了一个更好的解决方案:我不是阻止请求的可运行
,而是阻止回调
执行
我已经扩展了回调
接口:
public interface CustomCallbackInterface<T> extends Callback<T> {
public String getTag();
public String setTag(String tag);
public void cancel();
public boolean isCanceled();
}
每次提出新请求时,我都将创建的CustomCallback
存储在列表中
cancel只需迭代列表并对具有相同标记的项目调用cancel()
。我已经实现了一个基于Vektor88应答的易于使用的类
public abstract class CancelableCallback<T> implements Callback<T> {
private static List<CancelableCallback> mList = new ArrayList<>();
private boolean isCanceled = false;
private Object mTag = null;
public static void cancelAll() {
Iterator<CancelableCallback> iterator = mList.iterator();
while (iterator.hasNext()){
iterator.next().isCanceled = true;
iterator.remove();
}
}
public static void cancel(Object tag) {
if (tag != null) {
Iterator<CancelableCallback> iterator = mList.iterator();
CancelableCallback item;
while (iterator.hasNext()) {
item = iterator.next();
if (tag.equals(item.mTag)) {
item.isCanceled = true;
iterator.remove();
}
}
}
}
public CancelableCallback() {
mList.add(this);
}
public CancelableCallback(Object tag) {
mTag = tag;
mList.add(this);
}
public void cancel() {
isCanceled = true;
mList.remove(this);
}
@Override
public final void success(T t, Response response) {
if (!isCanceled)
onSuccess(t, response);
mList.remove(this);
}
@Override
public final void failure(RetrofitError error) {
if (!isCanceled)
onFailure(error);
mList.remove(this);
}
public abstract void onSuccess(T t, Response response);
public abstract void onFailure(RetrofitError error);
}
公共抽象类CancelableCallback实现回调{
私有静态列表mList=newarraylist();
私有布尔值isCanceled=false;
私有对象mTag=null;
公共静态void cancelAll(){
迭代器迭代器=mList.Iterator();
while(iterator.hasNext()){
iterator.next().isCanceled=true;
iterator.remove();
}
}
公共静态无效取消(对象标记){
如果(标记!=null){
迭代器迭代器=mList.Iterator();
可取消的回调项;
while(iterator.hasNext()){
item=iterator.next();
if(tag.equals(item.mTag)){
item.isCanceled=true;
iterator.remove();
}
}
}
}
公共可取消回调(){
添加(本);
}
公共可取消回调(对象标记){
mTag=标签;
添加(本);
}
公开作废取消(){
isCanceled=true;
删除(此);
}
@凌驾
公开最终无效成功(T,响应){
如果(!已取消)
onSuccess(t,response);
删除(此);
}
@凌驾
公共最终作废失败(改装错误){
如果(!已取消)
失败(错误);
删除(此);
}
成功时公开摘要无效(T,响应);
公开摘要失效(错误);
}
用法示例
rest.request(..., new CancelableCallback<MyResponse>(TAG) {
@Override
public void onSuccess(MyResponse myResponse, Response response) {
...
}
@Override
public void onFailure(RetrofitError error) {
...
}
});
// if u need to cancel all
CancelableCallback.cancelAll();
// or cancel by tag
CancelableCallback.cancel(TAG);
rest.request(…,新的CancelableCallback(标记){
@凌驾
成功时公共无效(MyResponse MyResponse,Response Response){
...
}
@凌驾
公共void onFailure(改型错误){
...
}
});
//如果你需要取消所有
CancelableCallback.cancelAll();
//或者通过标签取消
CancelableCallback.cancel(标记);
您能再添加一点代码吗?喜欢这个要求吗call@letroll您将请求作为一个普通的请求发出,但不使用new Callback
而是使用Callback cb=new Callback
,这样您就有了一个引用,然后可以调用callbacks.add(cb)
我不是专家,但我认为您是在请求得到响应后返回的(在您的代码中:成功)。您并没有在空中取消请求:),但我可能错了。@feresr是的,在改装2.0之前,无法取消任何正在进行的请求,但这样的话,响应就会被忽略。另外@feresr他在请求得到响应后返回,但在请求成功时他什么也没做,这意味着请求实际上被取消了,我也认为这是最好的方式,因为在改装过程中,没有办法取消请求
rest.request(..., new CancelableCallback<MyResponse>(TAG) {
@Override
public void onSuccess(MyResponse myResponse, Response response) {
...
}
@Override
public void onFailure(RetrofitError error) {
...
}
});
// if u need to cancel all
CancelableCallback.cancelAll();
// or cancel by tag
CancelableCallback.cancel(TAG);