我需要在里面重试请求OkHttp Interceptor.例如,存在需要Authorization令牌的传入请求.如果Authorization令牌已过期,则服务器返回带403代码的响应.在这种情况下,我正在检索一个新令牌并尝试使用相同的chain对象再次进行调用.
但是OkHttp会抛出一个异常,它声明你不能用同一个chain对象发出两个请求.
java.lang.IllegalStateException: network interceptor org.app.api.modules.ApplicationApiHeaders@559da2 must call proceed() exactly once
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一个干净的解决方案来解决内部重试网络请求的问题OkHttp Interceptor?
谢谢
public final class ApplicationApiHeaders implements Interceptor {
private static final String AUTHORIZATION = "Authorization";
private TokenProvider mProvider;
public ApplicationApiHeaders(TokenProvider provider) {
mProvider = provider;
}
@Override
public Response intercept(Chain chain) throws IOException {
Token token = mProvider.getApplicationToken();
String bearerToken = "Bearer " + token.getAccessToken();
System.out.println("Token: " + bearerToken);
Request request = …Run Code Online (Sandbox Code Playgroud) 我的目标是通过指定API密钥来限制对客户端应用程序的API的访问.各种服务允许您通过密钥访问其API,您必须获取这些密钥以执行请求.
注意:这与用户身份验证无关.
在django rest框架中有没有直接的解决方案呢?或者只是在请求标头中传递密钥然后手动处理它?
问候
Project包含注释处理器,它在编译期间生成Java代码.默认情况下,gradle输出生成的源文件到build/classes目录中.这会导致IntelliJ发现新生成的源文件时出现一些问题.
是否有任何直接的方法配置gradle将源文件输出到另一个目录?例如$buildDir/gen/main/java或$buildDir/build/generated/main/java?
我一直在寻找完美的Android应用程序架构,并阅读了一些关于这个主题的精彩博文.
1)http://www.mdswanson.com/blog/2014/04/07/durable-android-rest-clients.html
2)http://birbit.com/a-recipe-for-writing-responsive-rest-clients-on-android/
这两篇文章描述了如何利用事件总线在android组件(活动,片段,服务)之间进行通信.
一个但非常重要的主题没有涉及.如何处理暂停时发布到UI组件的事件.
例如:服务是在完成将数据下载到活动时发布事件.此时活动暂停.由于事件总线在onPause()中未注册,我们完全失去了这个事件.
来自greendao的EvenBus提供stickyevents.但如果不删除它们会导致内存泄漏.
来自square的Otto介绍了"Producer"模式,可用于代替粘性事件.
如果未手动删除粘性事件,则第一种解决方案可能导致内存泄漏.
第二个需要将数据保存在某处,直到Producer方法将其返回给订阅者.这个解决方案似乎更正确,但需要编写更多代码.
任何人都可以分享如何解决这个边缘案例的想法?有清洁的解决方案
I'm looking for something roughly like this take, but atomic:
impl<T: Clone> for Arc<T> {
fn take(mut self) -> T {
Arc::make_mut(&mut self);
Arc::try_unwrap(self).unwrap()
}
}
Run Code Online (Sandbox Code Playgroud)
In other words, I want Arc::make_mut which returns the value itself, rather than a mutable reference.
我正在尝试使用以下表示构建树状数据结构Node:
use std::cmp::Ordering;
use std::fmt::Debug;
use std::sync::Arc;
const BRANCH_FACTOR: usize = 32;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
enum Node<T> {
Branch {
children: [Option<Arc<Node<T>>>; BRANCH_FACTOR],
len: usize,
},
RelaxedBranch {
children: [Option<Arc<Node<T>>>; BRANCH_FACTOR],
sizes: [Option<usize>; BRANCH_FACTOR],
len: usize,
},
Leaf {
elements: [Option<T>; BRANCH_FACTOR],
len: usize,
},
}
Run Code Online (Sandbox Code Playgroud)
枚举的变RelaxedBranch体很少使用,有时根本不使用。由于 Rust 中枚举的大小是由最大变体的大小定义的,因此RelaxedBranch总体上显着增加了内存占用Node。此枚举的较大尺寸会导致 20% 的性能下降,这在我的情况下是不可接受的。
作为枚举的替代方案,我决定尝试特征对象:
use std::cmp::Ordering;
use std::fmt::Debug;
use std::sync::Arc;
const BRANCH_FACTOR: usize = 32;
trait Node<T>: Debug + Clone …Run Code Online (Sandbox Code Playgroud)