HappyVolley

HappyVolley

  • 在非UI線程返回Response且可以配置并發(fā)線程數(shù)的Volley(未改動(dòng)源碼)<br />
  • 提供Cancel單個(gè)Request的封裝
  • 采用MVP標(biāo)準(zhǔn)架構(gòu)搭建Demo

前言

我知道...我懂
大家現(xiàn)在都用 OKHttp 或者 Retrofit <br />
為啥這里還要發(fā)布和二次封裝 Volley 呢?

原因有三

  • 以往的成果還是做個(gè)記錄.
  • Volley在沒(méi)有上傳下載等類似Task的情況下 還是有生存空間的.
  • 哈哈~秘密...這個(gè)以后再談...

解決什么問(wèn)題

  1. Volley默認(rèn)是在UI Thread返回Response,導(dǎo)致如果還需要對(duì)數(shù)據(jù)進(jìn)行操作(比如DB,篩選,排序等相對(duì)耗時(shí)任務(wù)),則需要另起Task(非UI Thread)去做.這樣就存在新的同步問(wèn)題,甚至踏入callback深淵.<br />
    解決
    通過(guò)傳入ExecutorService來(lái)讓其成為單線程模型,Response依然在非UI Thread返回.這樣數(shù)據(jù)層可以繼續(xù)對(duì)其進(jìn)行操作.
    當(dāng)結(jié)果返回到業(yè)務(wù)層的時(shí)候 再通知GUI更新即可(Handler EventBus等隨意了).
  2. Volley默認(rèn)采用4個(gè)線程作為線程池控制,無(wú)法修改.<br />
    解決
    我們通過(guò)Volley構(gòu)造方法<br />
     /**
     * Creates the worker pool. Processing will not begin until {@link #start()} is called.
     *
     * @param cache A Cache to use for persisting responses to disk
     * @param network A Network interface for performing HTTP requests
     * @param threadPoolSize Number of network dispatcher threads to create
     * @param delivery A ResponseDelivery interface for posting responses and errors
     */
        public RequestQueue(Cache cache, Network network, int threadPoolSize,
            ResponseDelivery delivery) {
        mCache = cache;
        mNetwork = network;
        mDispatchers = new NetworkDispatcher[threadPoolSize];
        mDelivery = delivery;
        }

去創(chuàng)建一個(gè)新的RequestQueue對(duì)象即可解決這個(gè)問(wèn)題.

3. Demo中還附送福利 <br />
BaseRequest類中贈(zèng)送 Cancel的封裝 <br />
可以根據(jù)傳入的Tag Cancel單個(gè)Request 或者 Cancel All Request

    /**
     * 取消所有請(qǐng)求
     */
    public static void cancelAllRequest() {
        HappyRequestQueue.getInstance().getRequestQueue().cancelAll(new RequestQueue.RequestFilter() {
            @Override
            public boolean apply(Request<?> request) {
                Log.w(TAG, "Cancel All Request");
                return true;
            }
        });
    }

    /**
     * 根據(jù)tag來(lái)取消符合tag的請(qǐng)求
     *
     * @param tag String
     */
    public static void cancelRequest(final String tag) {
        // 取消已經(jīng)存在的請(qǐng)求力崇,防止重復(fù)請(qǐng)求
        HappyRequestQueue.getInstance().getRequestQueue().cancelAll(new RequestQueue.RequestFilter() {
            @Override
            public boolean apply(Request<?> request) {
                boolean cancel = tag.equals(request.getTag());
                if (cancel) {
                    Log.w(TAG, "Cancel Old Request: " + tag);
                }
                return cancel;
            }
        });
    }

工程描述

本來(lái)是說(shuō)就放個(gè)HappyRequestQueue類好了.反正大家也看得懂.
后來(lái)想想算了咱們還是做個(gè)Demo吧.
誰(shuí)讓哥做人這么厚道呢...

那就開(kāi)始寫(xiě)唄...
啪啪啪~

工程一定要基于Android Studio才溜得飛起
MVP架構(gòu)搞起來(lái) 各種Niubility... <br />

Paste_Image.png

網(wǎng)絡(luò)請(qǐng)求庫(kù)的Demo 肯定要請(qǐng)求點(diǎn)啥啊...恩對(duì)~
但是...天吶~~~哪有API來(lái)做Demo測(cè)試呢?

好在我機(jī)智...找到淘寶有個(gè)手機(jī)號(hào)的API接口 不用像百度那樣非要appkey

https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=手機(jī)號(hào) <br />

坑爹的是這個(gè)接口不能用POST,以往封裝好的JSONRequest無(wú)法直接使用...
不過(guò)這也難不倒哥...改就是了 , GET分分鐘搞定...
雖然顯得不夠優(yōu)雅.
但是我們的重點(diǎn)不是這一層啊...

做完后的樣子...<br />

Paste_Image.png

使用說(shuō)明

因?yàn)槭莻€(gè)單例類
直接使用

HappyRequestQueue.getInstance().addRequest(YourRequest);

YourRequest extends com.android.volley.Request<T> <br />
即可

具體代碼

public class HappyRequestQueue {
    public final String TAG = "RequesterDefaultTag";
    /**
     * Default on-disk cache directory.
     */
    private static final String DEFAULT_CACHE_DIR = "volley";
    /**
     * Number of network request dispatcher threads to start.
     */
    private static final int DEFAULT_NETWORK_THREAD_POOL_SIZE = 1;

    RequestQueue mRequestQueue;
    ExecutorService executorService = Executors.newFixedThreadPool(1);

    /**
     * getInstance
     *
     * @return RequestQueue
     */
    public static HappyRequestQueue getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private static class SingletonHolder {
        static final HappyRequestQueue INSTANCE = new HappyRequestQueue();
    }

    /**
     * 異步請(qǐng)求
     *
     * @param request Request
     * @param <T>     Request
     */
    public <T> void addRequest(Request<T> request) {
        addRequest(request, null);
    }

    /**
     * 異步請(qǐng)求
     *
     * @param request Request
     * @param tag     tag用于區(qū)分是否同一個(gè)請(qǐng)求
     * @param <T>     Request
     */
    public <T> void addRequest(Request<T> request, Object tag) {
        request.setTag(tag == null ? TAG : tag);
        getRequestQueue().add(request);
    }

    /**
     * 同步請(qǐng)求
     *
     * @param request Request
     * @param <T>     Request
     * @return JSONObject
     */
    public <T> JSONObject addSyncRequest(Request<T> request) {
        return addSyncRequest(request, null);
    }

    /**
     * 同步請(qǐng)求
     *
     * @param request Request
     * @param tag     tag用于區(qū)分是否同一個(gè)請(qǐng)求
     * @param <T>     Request
     * @return JSONObject
     */
    public <T> JSONObject addSyncRequest(Request<T> request, Object tag) {
        request.setTag(tag == null ? TAG : tag);
        RequestFuture<JSONObject> future = RequestFuture.newFuture();
        getRequestQueue().add(request);
        try {
            return future.get();
        } catch (InterruptedException | ExecutionException e) {
            Log.e(TAG, e.getMessage());
        }
        return null;
    }

    public com.android.volley.RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            //mRequestQueue = Volley.newRequestQueue(MyApplication.getInstance().getApplicationContext());
            mRequestQueue = newRequestQueue(MyApplication.getInstance().getApplicationContext());
        }
        return mRequestQueue;
    }

    /**
     * 自定義Volley請(qǐng)求Queue
     *
     * @param context Context
     * @return RequestQueue
     */
    public RequestQueue newRequestQueue(Context context) {
        File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
        Network network = new BasicNetwork(new HurlStack());
        //**重點(diǎn)就是在這里new ExecutorDelivery(executorService),是不是很簡(jiǎn)單**
        RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir),
                network,
                DEFAULT_NETWORK_THREAD_POOL_SIZE,
                new ExecutorDelivery(executorService));
        queue.start();
        return queue;
    }

}

鏈接

1.https://github.com/xmagicj/HappyVolley<br />

怎樣直接添加License?誰(shuí)可以分享一下?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赢织,隨后出現(xiàn)的幾起案子亮靴,更是在濱河造成了極大的恐慌,老刑警劉巖于置,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茧吊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡八毯,警方通過(guò)查閱死者的電腦和手機(jī)搓侄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)话速,“玉大人讶踪,你說(shuō)我怎么就攤上這事〔唇唬” “怎么了乳讥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵柱查,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我云石,道長(zhǎng)唉工,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任汹忠,我火速辦了婚禮酵紫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘错维。我一直安慰自己奖地,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赋焕。 她就那樣靜靜地躺著参歹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隆判。 梳的紋絲不亂的頭發(fā)上犬庇,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音侨嘀,去河邊找鬼臭挽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咬腕,可吹牛的內(nèi)容都是我干的欢峰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涨共,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纽帖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起举反,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懊直,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后火鼻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體室囊,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年魁索,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了融撞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛾默,死狀恐怖懦铺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情支鸡,我是刑警寧澤冬念,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布趁窃,位于F島的核電站,受9級(jí)特大地震影響急前,放射性物質(zhì)發(fā)生泄漏醒陆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一裆针、第九天 我趴在偏房一處隱蔽的房頂上張望刨摩。 院中可真熱鬧,春花似錦世吨、人聲如沸澡刹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)罢浇。三九已至,卻和暖如春沐祷,著一層夾襖步出監(jiān)牢的瞬間嚷闭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工赖临, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胞锰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓兢榨,卻偏偏與公主長(zhǎng)得像嗅榕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子色乾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容