Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> MyHttpUtils一個非常好用的異步網絡請求框架

MyHttpUtils一個非常好用的異步網絡請求框架

編輯:關於Android編程

一、能做什麼

你只需要傳urlJavaBean就可以在回調方法裡面得到想要的結果,你會發現你的代碼裡面沒有了子線程、沒有了handle,鏈式的變成使得代碼更加清晰。

1.1 功能

支持get、post請求; 支持http和https的協議; 支持設置連接、讀取超時時間(可選); 支持json格式的請求結果(無論json格式多復雜,都能搞定); 支持傳入JavaBean對象(解析之後的javabean對象); 支持回調方法中反應傳入javabean對象,這樣可以在回調方法中直接拿到解析過後的javabean對象; 支持回調方法中更新UI(所以叫異步請求了)。

說明:java中一切皆對象,這裡的JavaBean對象就是你請求接口之後返回的json數據所對應的實體。

1.2 使用場景

大部分的網絡請求都是返回json格式的數據,秉承java中一切皆對象的原則,這個json格式的數據必定對應一個JavaBean。你只要能通過json格式構造出相應的javabean對象(文章的最後會介紹如何快速構造JavaBean對象),那麼用幾行代碼就可以幫你解析出來。(如果你的項目中不能使用Retrofit,OkHttp那麼你是找對地方了)。所以,只要請求接口返回的數據格式是json的都可以用。

備注:目前還不支持文件上傳和下載,後續將跟進,敬請關注

二、怎麼用

方法一:gradle導入(推薦

compile 'com.hdl:myhttputils:1.0'

方法二:導入arr包(上面方法失敗的話就用這個吧)
進入項目的github主頁,下載該項目,arr文件就在.\MyHttpUtils\myhttputils1.0\build\outputs\aar文件夾下面(點擊這裡進入github)。

由於使用到了由於框架中使用到了gson,所以也需要加入gson的依賴。

compile 'com.google.code.gson:gson:2.2.4'

三、應用舉例

3.1 get請求

下面通過一個查詢ip地址信息的demo來介紹get方式的使用(先來看運行的效果圖):
這裡寫圖片描述

上代碼:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> /** * 獲取IP地址的監聽事件 * * @param view */ public void onGetIP(View view) { String url = "http://ip.taobao.com/service/getIpInfo.php?ip=182.254.34.74";//請求的接口 new MyHttpUtils() .url(url)//請求的url .setJavaBean(IPBean.class)//設置需要解析成的javabean對象 .setReadTimeout(60000)//設置讀取超時時間,不設置的話默認為30s(30000) .setConnTimeout(6000)//設置連接超時時間,不設置的話默認5s(5000) .onExecute(new CommCallback() {//開始執行異步請求,傳入一個通用回調對象,泛型為返回的javabean對象 @Override public void onSucess(IPBean ipBean) {//成功之後回調 KLog.e("測試:" + ipBean.toString()); Toast.makeText(MainActivity.this, ipBean.toString(), Toast.LENGTH_SHORT).show(); } @Override public void onFailed(String msg) {//失敗時候回調 KLog.e(msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } }); }

方法及參數說明:
-url():設置請求的接口地址,參數類型為String。(必填)
-setJavaBean():設置解析之後的JavaBean對象,記得加.class。(必填
-onExecute():設置開始請求(get)接口,請求結果在回調方法中,參數為CommCallback,可加泛型。(必填
-setReadTimeout():設置讀取超時時間(默認30s),參數為整型,單位:毫秒。(可選
-setConnTimeout():設置連接超時時間(默認5s),參數為整型,單位:毫秒。(可選

3.2 post請求

下面通過一個獲取用戶備注、和跟蹤信息的例子來說明post的用法(先看效果圖):
這裡寫圖片描述

上代碼:

  public void onGetRemark(View view) {
        String remarkUrl = "http://192.168.1.161:8080/Test/userInfoController/updateUser.action";
        HashMap param = new HashMap<>();
        param.put("userid", "7cf6871beeed856df47eb189");
        param.put("uid", "8011bddb58588ab54");
        new MyHttpUtils()
                .url(remarkUrl)
                .addParam(param)
                .setJavaBean(RemarkBean.class)
                .onExecuteByPost(new CommCallback() {
                    @Override
                    public void onSucess(RemarkBean remarkBean) {
                        Toast.makeText(MainActivity.this, remarkBean.toString(), Toast.LENGTH_SHORT).show();
                        KLog.e("解析出來的對象為:" + remarkBean.toString());
                    }
                    @Override
                    public void onFailed(String msg) {
                        KLog.e("錯誤消息:" + msg);
                    }
                });
    }
}

方法及參數說明:
-url():設置請求的接口地址,參數類型為String。(必填)
-setJavaBean():設置解析之後的JavaBean對象,記得加.class。(必填
-addParam():設置post請求的參數,參數為hashmap類型。(必填
-onExecuteByPost():設置開始請求(post)接口,請求結果在回調方法中,參數為CommCallback,可加泛型。(必填
-setReadTimeout():設置讀取超時時間(默認30s),參數為整型,單位:毫秒。(可選
-setConnTimeout():設置連接超時時間(默認5s),參數為整型,單位:毫秒。(可選

通過上面的兩個例子是不是覺得這個框架很好用,只需要傳url,javabean就可以在回調方法裡面得到想要的結果,你會發現你的代碼裡面沒有了子線程、沒有了handle,鏈式編程使得代碼結構更加清晰。如果對Rxjava,Retrofit,OkHttp熟悉的朋友肯定覺得這種方式似曾相識,的確這種鏈式+回調有很多的好處。

四、如何快速通過json構建javabean對象

推薦一個非常好用的AS插件GsonFormat。(當然,你也可以通過http://www.jsonschema2pojo.org/直接生成javabean對象,不是很喜歡,因為沒有GsonFormat好用)

4.1 什麼是GsonFormt

就是直接將json數據格式轉換為javabean對象的as插件。

4.2 安裝步驟

settings–>Plugins—>輸入GsonFormat—>Browse—>Install—>重啟as即可
來個圖看看:
這裡寫圖片描述

4.3 怎麼用GsonFormat

1)、比如你請求接口之後,返回的json數據是:

{
  "username":"hdl",
  "pwd":"L23LK4J3LJLKJL436LKJKL7LJLGKK4"
}

2)、先新建一個與json數據對應類,這個類名隨意,在類中使用快捷鍵alt+Insert(右鍵–>Generate也可以)會彈出一個對話框,第一個就是GsonFormat插件,打開之後讓你輸入Json數據,點擊確定—>確定即可自動生成。最後實現Serializable 接口即可(為了能更好地測試數據,你最後重寫toString方法)。再來個圖

這裡寫圖片描述
3)、這樣你就可以得到框架中setJavaBean()中的JavaBean了。你只需要傳url,javabean就可以在回調方法裡面得到想要的結果,是不是很簡單?。

有人可能會說這是簡單的一個javabean對象,復雜的json怎麼搞?帶json數組的又咋搞。

那我可以負責的告訴你,方法一樣的。只要你的json格式正確就能生成對應的javabean對象。來看一個復雜的json。(豆瓣Top250的電影,屬性幾十個呢)
下面是請求豆瓣排名第一的電影(只是一條哦):https://api.douban.com/v2/movie/top250?start=0&count=1
這裡寫圖片描述
是不是很長很長,用gsonformat管理多長照樣搞定。復制json—>粘貼—>確定—>實現Serializable接口,四步搞定。
這裡寫圖片描述

溫馨提示:裡面的屬性名千萬不要改哦,必須要跟json數據生成的保持一致。要獲取list數據,通過類似於new javabean().getData()的方法就可以得到了。

五、封裝思路

使用講完了,來講講怎麼封裝的吧(感興趣的可以下載源碼,共同學習)。封裝過程其實很簡單,用到了三個東西線程、handler、httpurlconnection,回調思想。

5.1 回調思想

其他三個大家都懂,就只說說回調思想:說白了就是我調用某個方法,成功還是失敗,你總得告訴我一聲(是不是很直白)。來看看框架裡面用到的通用回調對象怎麼定義的。

public interface CommCallback {
    void onSucess(T t);//成功了就調用,返回的類型得到的類型就是T(傳入的JavaBean對象)
    void onFailed(String msg);//失敗了就調用,接收的就是錯誤信息。
}

就是這麼簡單。

5.2 get請求的封裝

 try {
                    URL url = new URL(urlPath);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setReadTimeout(readTimeout);
                    conn.setConnectTimeout(connectTimeout);
                    if (conn.getResponseCode() == 200) {
                        InputStream is = conn.getInputStream();
                        int len = 0;
                        byte[] buf = new byte[1024 * 1024];
                        StringBuilder json = new StringBuilder();
                        while ((len = is.read(buf)) != -1) {
                            json.append(new String(buf, 0, len));
                        }
                        is.close();
                        Message msg = mHanler.obtainMessage();
                        msg.what = WHAT_REQSUCCESS;
                        msg.obj = json.toString();
                        mHanler.sendMessage(msg);
                    } else {
                        mHanler.sendEmptyMessage(WHAT_REQFAILED);
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    mHanler.sendEmptyMessage(WHAT_URLFAILED);
                } catch (IOException e) {
                    mHanler.sendEmptyMessage(WHAT_IOFAILED);
                    e.printStackTrace();
                }

這簡直就是標准的HttpurlConnection請求方式嘛。我就不一一說了。post請求類似。

5.3 封裝的經過

來說說為啥要使用HttpUrlConnection來封裝。一方面,它是官方推薦的網絡請求方式,但是請求過程代碼太累贅(看看上面的代碼就知道了),於是就像封裝一下,用幾行代碼就搞定,提高工作效率;還有一個原因就是在我維護的一個項目中,之前的那個人用的是OKHttp2.X開發的,在新增功能的時候不想用okhttp2.X了,聽過有bug。但是升級到okhttp3.X的話要改的又太多。於是我就想到了Retrofit,但是其實Retrofit底層也是用okhttp實現的,雖然導入retrofit依賴的時候不會報錯,但是運行的時候就錯了(估計是包沖突了),於是我又想到了以前用過的vollery和xUtils,額,還是算了,它們封裝的東西太多了,我就簡簡單單的發個網絡請求而已。怎麼辦呢,就只用httpurlconnection了,直接用這個呢要寫的代碼真的是太冗余了,於是就有了這個封裝的網絡請求框架了,基本上可以滿足大部分的網絡請求了,目前還不支持文件上傳、下載,後續會跟進,敬請關注。

六、下載地址

源碼及demo下載地址:https://github.com/huangdali/MyHttpUtils

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved