Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用正方形';s改装客户端,是否可以取消正在进行的请求?如果是,怎么做?_Java_Android_Networking_Retrofit - Fatal编程技术网

Java 使用正方形';s改装客户端,是否可以取消正在进行的请求?如果是,怎么做?

Java 使用正方形';s改装客户端,是否可以取消正在进行的请求?如果是,怎么做?,java,android,networking,retrofit,Java,Android,Networking,Retrofit,我正在使用Square的改造客户端从Android应用程序发出短期json请求。有没有办法取消一个请求?如果是,怎么做 将回调包装在一个委托对象中,该委托对象将回调实现为 好。调用某个方法清除委托,并使其 无论何时收到响应,都没有op 看看下面的讨论 更好的策略是取消回调执行 要取消异步改装请求,可以通过关闭执行异步请求的来实现 例如,我使用此代码来构建重新适应程序: Builder restAdapter = new RestAdapter.Builder(); restAdapter.se

我正在使用Square的改造客户端从Android应用程序发出短期json请求。有没有办法取消一个请求?如果是,怎么做

将回调包装在一个委托对象中,该委托对象将回调实现为 好。调用某个方法清除委托,并使其 无论何时收到响应,都没有op

看看下面的讨论

更好的策略是取消回调执行


要取消异步改装请求,可以通过关闭执行异步请求的来实现

例如,我使用此代码来构建
重新适应程序

Builder restAdapter = new RestAdapter.Builder();
restAdapter.setEndpoint(BASE_URL);
restAdapter.setClient(okClient);
restAdapter.setErrorHandler(mErrorHandler);
mExecutorService = Executors.newCachedThreadPool();
restAdapter.setExecutors(mExecutor, new MainThreadExecutor());
restAdapter.setConverter(new GsonConverter(gb.create()));
并以这种方式强行放弃这些要求:

public void stopAll(){
   List<Runnable> pendingAndOngoing = mExecutorService.shutdownNow();
   // probably await for termination.
}
public void stopAll(){
List pendingAndOngoing=mExecutorService.shutdownNow();
//可能正在等待终止。
}
或者,您可以使用
ExecutorCompletionService
poll(超时,TimeUnit.miliskes)
take()
所有正在进行的任务。这将防止线程池不被关闭,就像关闭
shutdownNow()
一样,因此您可以重用
ExecutorService

希望能对某人有所帮助

编辑:从OkHttp 2开始,可以执行
。取消(对象标记)
。我们应该期望在即将进行的改装中具有相同的功能:

您可以使用实际的
Request
对象来取消它

okClient.cancel(请求)

或者,如果您已向
Request.Builder
提供了标记,则必须使用

okClient.cancel(request.tag())

所有正在进行的、已执行的或挂起的请求都在
Dispatcher
okClient.getDispatcher()
中排队。您也可以在此对象上调用cancel方法。Cancel方法将通知OkHttp
引擎
,以终止与主机的连接(如果已经建立)


编辑2:改装2具有全功能取消请求

我可能会晚一点,但我可能已经找到了解决办法。
我无法阻止执行请求,但如果您对正在执行的请求感到满意,并且什么也不做,您可以检查我提出的问题和答案。

我已经基于答案实现了可取消回调类

公共抽象类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(标记);

现在,在最新版本的改装V 2.0.0.beta2中有一种简单的方法。也可以实施重试。

查看此处

根据通过链接更新的2.0 beta 3变更日志

New:isCanceled()方法返回调用是否已取消。在onFailure中使用此选项可确定回调是从取消还是实际传输失败中调用的


这应该会让事情变得更简单。

这是为了改进2.0,方法调用。cancel()也会取消飞行中的调用。下面是它的文档定义

retrofit2.Call

public abstract void cancel()

取消这个电话。将尝试取消飞行中的呼叫,如果呼叫尚未执行,则永远不会执行。

有相关更新吗?我也遇到了同样的问题幸运的是,没有,虽然我刚刚提交了这个文件。是的,我发现之后,看起来好像是在他们的计划中……注意,这是不鼓励的,所以答案应该是寻找解决方案的终点(与另一个参考文献的中途停留相比,随着时间的推移,这些参考文献往往会过时)。请考虑在这里添加一个独立的概要,将链接作为引用。在哪个线程上执行<代码>关闭节点> /代码>?因为目前我是在UI线程上执行的,请求/传输根本没有取消。调用Shutdownow()后,您是否也尝试过等待终止?没有,但这会有什么区别?@NikolaDespotoski如何使用request.Builder在系统中,您能举一个正在工作的示例代码吗?我不知道该怎么做。很好的解决方案,但是当您删除对象f时,您的cancelAll和cancel(ObjectTag)将显示java.util.ConcurrentModificationException
retrofit2.Call

public abstract void cancel()