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项目中已上载一个问题: