編輯:關於Android編程
你只需要傳url,JavaBean就可以在回調方法裡面得到想要的結果,你會發現你的代碼裡面沒有了子線程、沒有了handle,鏈式的變成使得代碼更加清晰。
說明:java中一切皆對象,這裡的JavaBean對象就是你請求接口之後返回的json數據所對應的實體。
大部分的網絡請求都是返回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'
下面通過一個查詢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
方法及參數說明:
-url():設置請求的接口地址,參數類型為String。(必填)
-setJavaBean():設置解析之後的JavaBean對象,記得加.class。(必填)
-onExecute():設置開始請求(get)接口,請求結果在回調方法中,參數為CommCallback,可加泛型。(必填)
-setReadTimeout():設置讀取超時時間(默認30s),參數為整型,單位:毫秒。(可選)
-setConnTimeout():設置連接超時時間(默認5s),參數為整型,單位:毫秒。(可選)
下面通過一個獲取用戶備注、和跟蹤信息的例子來說明post的用法(先看效果圖):
上代碼:
public void onGetRemark(View view) { String remarkUrl = "http://192.168.1.161:8080/Test/userInfoController/updateUser.action"; HashMapparam = 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熟悉的朋友肯定覺得這種方式似曾相識,的確這種鏈式+回調有很多的好處。
推薦一個非常好用的AS插件GsonFormat。(當然,你也可以通過http://www.jsonschema2pojo.org/直接生成javabean對象,不是很喜歡,因為沒有GsonFormat好用)
就是直接將json數據格式轉換為javabean對象的as插件。
settings–>Plugins—>輸入GsonFormat—>Browse—>Install—>重啟as即可
來個圖看看:
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,回調思想。
其他三個大家都懂,就只說說回調思想:說白了就是我調用某個方法,成功還是失敗,你總得告訴我一聲(是不是很直白)。來看看框架裡面用到的通用回調對象怎麼定義的。
public interface CommCallback{ void onSucess(T t);//成功了就調用,返回的類型得到的類型就是T(傳入的JavaBean對象) void onFailed(String msg);//失敗了就調用,接收的就是錯誤信息。 }
就是這麼簡單。
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請求類似。
來說說為啥要使用HttpUrlConnection來封裝。一方面,它是官方推薦的網絡請求方式,但是請求過程代碼太累贅(看看上面的代碼就知道了),於是就像封裝一下,用幾行代碼就搞定,提高工作效率;還有一個原因就是在我維護的一個項目中,之前的那個人用的是OKHttp2.X開發的,在新增功能的時候不想用okhttp2.X了,聽過有bug。但是升級到okhttp3.X的話要改的又太多。於是我就想到了Retrofit,但是其實Retrofit底層也是用okhttp實現的,雖然導入retrofit依賴的時候不會報錯,但是運行的時候就錯了(估計是包沖突了),於是我又想到了以前用過的vollery和xUtils,額,還是算了,它們封裝的東西太多了,我就簡簡單單的發個網絡請求而已。怎麼辦呢,就只用httpurlconnection了,直接用這個呢要寫的代碼真的是太冗余了,於是就有了這個封裝的網絡請求框架了,基本上可以滿足大部分的網絡請求了,目前還不支持文件上傳、下載,後續會跟進,敬請關注。
源碼及demo下載地址:https://github.com/huangdali/MyHttpUtils
兩個彈出框布局: java 文件: package hi.braincol.example.iphoneA
一.前言現在的app基本上都需要用到短信功能,注冊時或者有消息通知時需要給用戶發送一條短信,但是對於個人開發者來說,去買第三方的短信服務實在是有點奢侈,很好的是mob為我
首篇作為開始,先講講簡單的反編譯。反編譯通常有幾種目的:互相學習、借來用用、嘿嘿(干你,又分為小干干類似微信紅包,和大干干改別人的apk幫他上架)。因為沒帶kvm回來,m
你現在還是把錢都存在余額寶?相信你也注意到,現在理財方式越來越多,余額寶的收益也越來越低,比如說財付通的理財通,性質類似於余額寶。現在微信也有理財通,收益還