網上大神寫的文章已經很多,我寫這個只是想把自己的學習過程記錄下來,能看到自己一步步的成長,其實有些東西已經用過了,但很多時候用的是各種封裝的,想重新開始瞭解下,以前用過xutils,volley,到現在用okhttp,發現一入it深似海,需要不斷的學習,不然就會跟不上步伐,但是既已選擇,就無怨無悔,而且相比於做其他的工作,我還是更喜歡這樣狀態的自己。
這篇博客寫的是okhttp+gson解析的,其中輪播圖顯示用的是Banner+glide。等後面用到retrofit時便不需要自己解析,也不需要自己去實現子線程到主線程的回調,源碼裏面已經寫好了。
首先在build.gradle中添加依賴,這裏的話okio的依賴一定要添加,因爲okhttp在io處理時用到了
compile 'com.squareup.okio:okio:1.5.0'
compile 'com.youth.banner:banner:1.4.9'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.squareup.okhttp:okhttp:2.4.0'
在這裏用一個get請求的實例來進行講解,效果如下圖,這是是我自己用工具做的,看得有些晃眼
核心代碼:
private void getdata() {
//創建okHttpClient對象
OkHttpClient mOkHttpClient = new OkHttpClient();
//創建一個Request
final Request request = new Request.Builder().url("https://baiting.longruncloud.com/api/recommendations").build();
//請求加入調度,異步的方式執行請求
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(final Response response) throws IOException {
/**
* 這裏成功代表的是http返回成功,也就是若返回404、405之類的錯誤也會回調到這裏
* 所以我們需要自己判斷服務端返回碼,一般返回200是成功處理了請求
*/
if (response.code() == 200) {
final String res = response.body().string();
RecommendationBean recommendationBean = gson.fromJson(res, RecommendationBean.class);
carousels = recommendationBean.getCarousels();
/**
* 因爲Android 的網絡請求必須在非主線程,而視圖的更新必須在主線程
* 所以必須有子線程回調主線程這樣一個操作,而okhttp沒有添加任何關於Android的代碼
* 這樣可以使得okhttp可以應用於任何地點而單獨存在
* 但是在Android中就變成必須要自己去實現子線程到主線程的回調
* 也就是在執行異步請求之後,得到數據時我們又要使用runOnUiThread更新ui(設置界面)
*/
runOnUiThread(new Runnable() {
@Override
public void run() {
//增強for循環添加圖片路徑
for (RecommendationBean.CarouselsBean element : carousels) {
String image = element.getImage();
images.add(image);
}
//Banner圖片加載,支持手勢滑動,支持首尾循環
banner.setImageLoader(new GlideImageLoader());
// 設置圖片集合
banner.setImages(images);
//banner設置方法全部調用完畢時最後調用
banner.start();
}
});
}
}
});
}
註釋的已經很詳細,相信大家都能看懂,後面三行是加載輪播圖的,以前用imageloader的時候還挺麻煩的。其中需要用到的GlideImageLoader類和佈局文件我也貼出來:
public class GlideImageLoader extends ImageLoader {
@Override
public void displayImage(Context context, Object path, ImageView imageView) {
/**
圖片加載方式由自己選擇,我用的是glide
*/
Glide.with(context).load(path).into(imageView);
}
}
<com.youth.banner.Banner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
實體類的話大家可以在網頁上打開url,然後複製內容用studio自帶的gsonformat就可以創建。到此一個完整的網絡請求就完成了。
另外附上Post請求代碼:
OkHttpClient mOkHttpClient = new OkHttpClient();
FormEncodingBuilder builder = new FormEncodingBuilder();
builder.add("username", "okhttp");//有幾個參數add幾個
Request request = new Request.Builder()
.url("url地址")
.post(builder.build())
.build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
Log.e("Post---response", response + "");
//與get請求一樣,若涉及到回調主線程,都需要通過runOnUiThread或者handler更新ui
}
});
希望能和各位共同進步~