Android 使用截击请求的随机延迟
我正在使用一个Android 使用截击请求的随机延迟,android,android-volley,nanohttpd,Android,Android Volley,Nanohttpd,我正在使用一个Volley singleton向java制作的NanoHTTPD服务器发送POST消息。消息短,处理时间快,同时不超过1条消息 问题是队列中随机存在一些延迟来处理请求,导致加载时间为3-4秒。最常见的情况是第一条消息(这没有问题,我猜是在制作一些实例),或者在任何消息之后等待超过5-10秒。但是,如果我发送100条POST消息,两条消息之间有1秒的延迟,则没有问题 我已经检查了服务器,没有生成任何请求,因此问题出在客户端 在这些情况下,logcat显示: D/Volley:[83
Volley singleton
向java制作的NanoHTTPD
服务器发送POST消息。消息短,处理时间快,同时不超过1条消息
问题是队列中随机存在一些延迟来处理请求,导致加载时间为3-4秒。最常见的情况是第一条消息(这没有问题,我猜是在制作一些实例),或者在任何消息之后等待超过5-10秒。但是,如果我发送100条POST消息,两条消息之间有1秒的延迟,则没有问题
我已经检查了服务器,没有生成任何请求,因此问题出在客户端
在这些情况下,logcat显示:
D/Volley:[839]BasicNetwork.logSlowRequests:的HTTP响应
请求=
[lifetime=4768],[size=115],[rc=200],[retryCount=0]
做一些谷歌日志搜索意味着。。。在客户端处理请求需要时间
另一个可以尝试的解决方案是增加线程池大小,但这不起作用。第一个请求总是需要很多时间
这是单例代码:
public class VolleySingleton {
private static VolleySingleton mInstance;
private RequestQueue mRequestQueue;
private static Context mCtx;
private DiskBasedCache cache;
private BasicNetwork network;
/**
* @param context
*/
private VolleySingleton(Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();
}
/**
* @param context
* @return
*/
public static synchronized VolleySingleton getInstance(Context context) {
if (mInstance == null) {
mInstance = new VolleySingleton(context);
}
return mInstance;
}
/**
* @return
*/
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
// Instantiate the cache
cache = new DiskBasedCache(mCtx.getCacheDir(), 1024 * 1024); // 1MB cap
// Set up the network to use HttpURLConnection as the HTTP client.
network = new BasicNetwork(new HurlStack());
// getApplicationContext() is key, it keeps you from leaking the
// Activity or BroadcastReceiver if someone passes one in.
mRequestQueue = new RequestQueue(cache, network, 20);
mRequestQueue.start();
}
return mRequestQueue;
}
/**
* @param req
* @param <T>
*/
public <T> void addToRequestQueue(Request<T> req) {
req.setRetryPolicy(new DefaultRetryPolicy(
30000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
getRequestQueue().add(req);
}
}
公共类截击单打{
私人静态截击;
私有请求队列mRequestQueue;
私有静态上下文mCtx;
专用DiskBasedCache缓存;
专用基础网络;
/**
*@param上下文
*/
私人截击单打(上下文){
mCtx=上下文;
mRequestQueue=getRequestQueue();
}
/**
*@param上下文
*@返回
*/
公共静态同步截击单例getInstance(上下文){
if(minInstance==null){
mInstance=新的截击单打(上下文);
}
回报率;
}
/**
*@返回
*/
公共请求队列getRequestQueue(){
if(mRequestQueue==null){
//实例化缓存
cache=new DiskBasedCache(mCtx.getCacheDir(),1024*1024);//1MB上限
//设置网络以使用HttpURLConnection作为HTTP客户端。
网络=新的基本网络(new HurlStack());
//getApplicationContext()是关键,它可以防止泄漏
//活动或广播接收器(如果有人传入)。
mRequestQueue=newrequestqueue(缓存,网络,20);
mRequestQueue.start();
}
返回mrequest队列;
}
/**
*@param-req
*@param
*/
公共无效addToRequestQueue(请求请求){
请求setRetryPolicy(新的DefaultRetryPolicy(
30000,
DefaultRetryPolicy.DEFAULT\u最大重试次数,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
getRequestQueue().add(请求);
}
}
进行了更深入的调试,问题是服务器:
this.remoteHostname = !inetAddress.isLoopbackAddress() && !inetAddress.isAnyLocalAddress()?inetAddress.getHostName().toString():"localhost";
这将生成需要几秒钟的DNS查找
库github项目中已上载一个问题: