Android 開發(fā) - 基于okhttp框架封裝的開發(fā)框架oknet

概述

在android開發(fā)中經(jīng)常要訪問網(wǎng)絡(luò)般码,目前最流行的網(wǎng)絡(luò)訪問框架就是Okhttp了,然而我們?cè)诰唧w使用時(shí)乱顾,往往仍然需要二次封裝板祝。我使用Builder設(shè)計(jì)模式進(jìn)行了封裝形成oknet開源庫。

介紹

oknet是一套基于okhttp的android網(wǎng)絡(luò)http框架,封裝了請(qǐng)求參數(shù)處理走净,日志打印券时。

名稱:oknet
github地址:https://github.com/vir56k/oknet
作者: zhangyunfeiVir

特性

1.簡潔的語法
2.支持自定義處理 message code 不等于0 的情形
3.支持文件上傳
4.完整清晰的log日志輸出
5.支持 公共參數(shù) 的配置
6.支持每個(gè)http請(qǐng)求的 日志 記錄
7.支持 默認(rèn)異常 的處理
8.支持 移除文件下載(通過FileDownloader)

適用場景

和服務(wù)端產(chǎn)生約定消息結(jié)構(gòu):

返回的響應(yīng)的json格式一定為:

{code:0,   msg:"", body:""}
參數(shù)說明:
1.服務(wù)端 響應(yīng)成功 則返回對(duì)應(yīng)的json
2.code=0表示成功,body里如正確響應(yīng)json.
3.code非零表示失敗伏伯,msg表示失敗的文本橘洞。
4.body 節(jié)點(diǎn)里放置你的自定義json數(shù)據(jù)

引用

在你的項(xiàng)目的根目錄下的 build.gradle 文件中添加引用

compile 'zhangyf.vir56k:oknet:0.0.1'

示例:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'zhangyf.vir56k:oknet:0.0.1'
}

在系統(tǒng)啟動(dòng)時(shí)進(jìn)行一些配置

比如在你的繼承自Application的子類中,或者主Activity啟動(dòng)時(shí)配置说搅。

    //配置okhttp 緩存位置
    OknetConfig.setExternalCacheDir(getExternalCacheDir());
    //OknetConfig.setRequestParaInterceptor(new CustomRequestParaInterceptor1());
    OknetConfig.setRequestParaInterceptor(new CustomRequestParaInterceptor_jlb_app());
    OknetConfig.setDefaultExceptionHandler(new CustomDefalutExceptionHandler());
    OknetConfig.setLogInterceptor(new LogInterceptor() {
        @Override
        public void onLog(String tag, String msg) {
        //Log.i("日志攔截器攔截到 tag =" + tag, " msg = " + msg);
        }
    });

post簡單請(qǐng)求炸枣,和String類型的響應(yīng)

RequestBuilder.with(getActivity()).URL(Apis.GAEA_URLS.CAB_ADVERT_LIST).
            onSuccess(new CommonCallback<String>(String.class) {
                @Override
                public void onSuccess(String result, CommonMessage responseMessage, String responseString) {
                    Log.i(TAG, "==成功:" + result);
                    alert("==成功");
                }
            }).excute();

帶參數(shù)的請(qǐng)求,和 Json序列化的回調(diào)

Type t = new TypeToken<List<Demo2Cell>>() {
}.getType();
RequestBuilder.with(getActivity())
        .URL(Apis.Cab_Urls.GET_BOX_FREE_NEWS)
        .para("cabinet_code", "1412345678")
        .onSuccess(new CommonCallback<List<Demo2Cell>>(t) {
            @Override
            public void onSuccess(List<Demo2Cell> result, CommonMessage responseMessage, String responseString) {
                Log.i(TAG, "!!! 成功:" + result.get(0));
                alert("!!成功" + result.get(0));
            }
        })
        .excute();

自定義處理異常代碼(服務(wù)返回的消息里的 message code 不等于0) 的情形

   RequestBuilder.with(getActivity())
            .URL(Apis.GAEA_URLS.CAB_ADVERT_LIST)
            .onSuccess(new CommonCallback<String>(String.class) {
                @Override
                public void onSuccess(String result, CommonMessage responseMessage, String responseString) {
                    Log.i(TAG, "==成功:" + result);
                    alert("==成功");
                }
                @Override
                public boolean onFailure(int httpCode, Exception ex, CommonMessage responseMessage, String responseString) {
                    if (ex instanceof NoZeroException) {
                        NoZeroException noZeroException = (NoZeroException) ex;
                        int code = noZeroException.getCode();
                        Log.i(TAG, "!!!!!!!!失敗:" + noZeroException);
                        alert("!!!!!!!!!!!!!!!!失敗," + noZeroException);
                        //return false;//如果不需要 默認(rèn)異常處理器再次處理蜓堕,這里可以返回true
                    }
                    return super.onFailure(httpCode, ex, responseMessage, responseString);
                }
            })
            .excute();

上傳文件

File f = new File(Environment.getExternalStorageDirectory().getPath(), "ImageCache/CloseIcon.png");
    if (!f.exists())
        throw new RuntimeException("not found ImageCache/CloseIcon.png");
    RequestBuilder.with(getActivity())
            .URL("http://10.0.1.232:8888/uc/suser/upload_avatar")
            .para("uid", "100202")
            .para("sid", "50e2904ca493d5d25475e4e080858925")
                    /************************ 威力僅僅在這一行,其他都一樣 ***************************/
            .file("file", f)
                    /************************ 威力僅僅在這一行,其他都一樣 ***************************/
            .onSuccess(new CommonCallback<Demo3Bean>(Demo3Bean.class) {
                @Override
                public void onSuccess(Demo3Bean result, CommonMessage responseMessage, String responseString) {
                    Log.i(TAG, "!!! 成功:" + result.count);
                    alert("!!成功" + result.count);
                }
            })
            .excute();

處理需要顯示進(jìn)度條的情形

RequestBuilder.with(getActivity())
            .URL(Apis.GAEA_URLS.CAB_NOTICE_LIST)
            .para("cabinet_code", "1412345678")
                    /******** 沒錯(cuò)尺上,你沒有看錯(cuò)晃危,僅僅 下面 一行,進(jìn)度條就閃亮登場 ************/
            .progress(new DialogProgressIndicator(getActivity()))
                    /******** 沒錯(cuò),你沒有看錯(cuò)囤攀,僅僅 上面 一行,進(jìn)度條就閃亮登場 ************/
            .onSuccess(new CommonCallback<Demo3Bean>(Demo3Bean.class) {
                @Override
                public void onSuccess(Demo3Bean result, CommonMessage responseMessage, String responseString) {
                    Log.i(TAG, "!!! 成功:" + result.count);
                    alert("!!成功" + result.count);
                }
            })
            .excute();

這里的 DialogProgressIndicator類 是一個(gè)“進(jìn)度條指示器”對(duì)象裁赠。

同步的方式發(fā)送http請(qǐng)求

private void demo_syncExcuete() {

    new AsyncTask<Void, Void, Void>() {
        boolean isok;
        String mResult1;

        @Override
        protected Void doInBackground(Void... params) {
            RequestBuilder.with(getActivity())
                    .URL(Apis.GAEA_URLS.CAB_ADVERT_LIST)
                    .para("cabinet_code", "1412345678")
                    .onSuccess(new CommonCallback<String>(String.class) {
                        @Override
                        public void onSuccess(String result, CommonMessage responseMessage, String responseString) {
                            isok = true;
                            mResult1 = result;
                        }

                        @Override
                        public boolean onFailure(int httpCode, Exception exception, CommonMessage responseMessage, String allResponseString) {
                            isok = false;
                            return super.onFailure(httpCode, exception, responseMessage, allResponseString);
                        }
                    })
                    .syncExcute();

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            if (isok) {
                Log.i(TAG, "==成功:" + mResult1);
                alert("==成功");
            }
        }
    }.execute();

}

下載文件

public static void downloadFileDemo() {
    String url = "http://d.hiphotos.baidu.com/zhidao/pic/item/08f790529822720e67a9065978cb0a46f21fab2a.jpg";
    File dest = new File(Environment.getExternalStorageDirectory(), "6f21fab2a.jpg");
    FileDownloader.downloadFile(url, dest, new FileDownloader.DownloadFileProgressListener2() {
        @Override
        public void onFailure(Call call, IOException e) {
            System.out.println("Err: " + e.getMessage());
        }

        @Override
        public void onProgress(long bytesRead, long contentLength, boolean done) {
            System.out.println(String.format("文件下載進(jìn)度, read %s/%s", bytesRead, contentLength));
        }

        @Override
        protected void onSuccess(Call call, File file) {
            System.out.println("文件下載成功嗎 =" + file.exists());

        }
    });
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市峰髓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌息尺,老刑警劉巖携兵,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搂誉,居然都是意外死亡徐紧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門炭懊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來并级,“玉大人,你說我怎么就攤上這事侮腹〕氨蹋” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵父阻,是天一觀的道長愈涩。 經(jīng)常有香客問我,道長加矛,這世上最難降的妖魔是什么履婉? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮荒椭,結(jié)果婚禮上谐鼎,老公的妹妹穿的比我還像新娘。我一直安慰自己趣惠,他們只是感情好狸棍,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著味悄,像睡著了一般草戈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侍瑟,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天唐片,我揣著相機(jī)與錄音,去河邊找鬼涨颜。 笑死费韭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庭瑰。 我是一名探鬼主播星持,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弹灭!你這毒婦竟也來了督暂?” 一聲冷哼從身側(cè)響起揪垄,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逻翁,沒想到半個(gè)月后饥努,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡八回,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年酷愧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缠诅。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伟墙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滴铅,到底是詐尸還是另有隱情,我是刑警寧澤就乓,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布汉匙,位于F島的核電站,受9級(jí)特大地震影響生蚁,放射性物質(zhì)發(fā)生泄漏噩翠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一邦投、第九天 我趴在偏房一處隱蔽的房頂上張望伤锚。 院中可真熱鬧,春花似錦志衣、人聲如沸屯援。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狞洋。三九已至,卻和暖如春绿店,著一層夾襖步出監(jiān)牢的瞬間吉懊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工假勿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留借嗽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓转培,卻偏偏與公主長得像恶导,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堡距,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,305評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理甲锡,服務(wù)發(fā)現(xiàn)兆蕉,斷路器,智...
    卡卡羅2017閱讀 134,708評(píng)論 18 139
  • 已經(jīng)立秋多日,仍是高溫的天氣缸废,秋天畢竟一步步向我們走來包蓝。秋天來了,瓜果會(huì)成熟企量,樹葉會(huì)枯落测萎,一些賬目是要算一算的。 ...
    xhy0606閱讀 577評(píng)論 2 5
  • 今日看了文友小美寫的《最好的風(fēng)水,在你嘴上》讓我獲益匪淺恕汇。她分別用了三個(gè)小標(biāo)題: (1)你嘴上所說的人生腕唧,...
    漫蘇閱讀 1,128評(píng)論 1 6
  • Spring Boot官方推薦的數(shù)據(jù)庫連接池是HikariCP,從一些第三方的評(píng)測結(jié)果看瘾英,HikariCP的性能比...
    藍(lán)色的咖啡閱讀 11,265評(píng)論 5 5