最近我开始使用Retrofit进行开发,并且可以立即注意到它没有提供一些重要的功能,例如 - 重试,认证处理,优先级等等。
我设法实现优先级并自行重试,但遇到难以解决的问题。
我想设法在他们到达执行者队列之前“捕获”网络请求,以便一遍又一遍地避免相同的请求。
对于前。用户有时可以一个接一个地拉5次刷新,我不想调用5个相同的请求。检查相同请求很容易 - 具有相同参数的相同域。
这是我的实施:
// the thread factory of the thread pool, we using it to indicate the threads' priority
ThreadFactory threadFactory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setPriority(threadPriority);
return t;
}
};
mQueue = new LinkedBlockingQueue<Runnable>();
mExecuter = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME, KEEP_ALIVE_TIME_UNIT, mQueue);
mExecuter.setThreadFactory(threadFactory);
mRestAdapter = new RestAdapter.Builder().setClient(new AndroidApacheClient()).setExecutors(mExecuter, mExecuter)
.setEndpoint(NetworkContants.DOMAIN).setRequestInterceptor(mRequestInterceptor).setConverter(new GsonConverter(new Gson()))
.build();
答案 0 :(得分:1)
您可以阻止使用标记执行更多请求,这很简单。
有一个这样的课程:确保你输入正确的。
public class CheckableCallback<T> implements Callback<T> {
private boolean isRunning;
public boolean isRunning() {
return isRunning;
}
public void setRunning(boolean isRunning) {
this.isRunning = isRunning;
}
@Override
public void success(T t, Response response) {
setRunning(false);
}
@Override
public void failure(RetrofitError error) {
setRunning(false);
}
}
在执行之前,请检查回调是否正在运行:
if(!mRefreshingCallback.isRunning()){
//execute
mRefreshingCallback.setRunning(true);
}
答案 1 :(得分:0)
如果令人耳目一新,你为什么不禁止拉动?在收到代替排队的响应之前,不允许请求是否有意义?