volley框架学习

需求场景:用户网络不好或者流量用完的时候,原生volley框架会抛一个com.android.volley.TimeoutError的异常错误,虽然这是这是正常的,但是有两个问题:
1.我们使用bugly检测,bugly上捕获到了这种错误,会影响我们APP的错误率。
2.只在bugly上体现,也无法衡量我们到底有多少用户出现这种问题。
所以,我们想把这个错误添加回调接口上抛出来,由应用层来接收处理和上报。

# 一.框架的学习
针对volly框架改造,那么首先就要学习一下volley框架。

首先看一下使用流程:

1.创建一个请求队列

RequestQueue mQueue = Volley.newRequestQueue(context);

2.添加com.android.volley.toolbox.Request对象到队列当中

JsonRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, url, jsonObject,
new Response.Listener(){});
mQueue.add(jsonRequest);

基本原理:

发现volley框架其实还是蛮简单的,分为三部分。

1.队列管理者RequestQuenue

2.收发请求处理管理者BasicNetwork

3.具体的收发请求类NetworkResponse

3.队列管理者的启动

3.1创建一个队列,都会走到一个默认的初始化方法:

 private static RequestQueue newRequestQueue(Context context, Network network) {
        File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
        RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
        queue.start();
        return queue;
    }

核心线程默认为4个,这个应该是不可以改的,先看下构造函数:

    public RequestQueue(
            Cache cache, Network network, int threadPoolSize, ResponseDelivery delivery) {
        mCache = cache;
        mNetwork = network;
        mDispatchers = new NetworkDispatcher[threadPoolSize];
        mDelivery = delivery;
    }

cache为缓存,

network为具体的收发处理类。

dispatchers对应的是线程,线程中取任务通过network收发处理类进行任务的调度,

ExecutorDelivery执行交付,处理最终返回的结果。

3.2队列线程的启动

/** Starts the dispatchers in this queue. */
    public void start() {
        stop(); // Make sure any currently running dispatchers are stopped.
        // Create the cache dispatcher and start it.
        mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);
        mCacheDispatcher.start();

        // Create network dispatchers (and corresponding threads) up to the pool size.
        for (int i = 0; i < mDispatchers.length; i++) {
            NetworkDispatcher networkDispatcher =
                    new NetworkDispatcher(mNetworkQueue, mNetwork, mCache, mDelivery);
            mDispatchers[i] = networkDispatcher;
            networkDispatcher.start();
        }
    }

networkDispatcher的run方法:

 

 

1负责从队列中取出具体的收发请求类,交由2进行具体的处理。

# 二.框架的改造


# 三.改造后框架的使用
 

你可能感兴趣的:(安卓)