okhttp獲取網絡數據之輪播圖效果實現

網上大神寫的文章已經很多,我寫這個只是想把自己的學習過程記錄下來,能看到自己一步步的成長,其實有些東西已經用過了,但很多時候用的是各種封裝的,想重新開始瞭解下,以前用過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
    }
});

希望能和各位共同進步~

                                                                                                    


發佈了45 篇原創文章 · 獲贊 12 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章