多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > 綜合技術(shù) > Android框架學(xué)習(xí)筆記01Okhttp框架

Android框架學(xué)習(xí)筆記01Okhttp框架

來(lái)源:程序員人生   發(fā)布時(shí)間:2016-10-08 15:12:06 閱讀次數(shù):2759次

  Google在Android6.0以后就刪除HttpClient相干的API,使用HttpUrlConnection代替,在Android開(kāi)發(fā)中,網(wǎng)絡(luò)訪問(wèn)是必不可少的,網(wǎng)絡(luò)上也有很多網(wǎng)絡(luò)操作的框架,這1篇,我們介紹1下網(wǎng)絡(luò)上非常火的1個(gè)網(wǎng)絡(luò)框架——Okhttp框架。

概述

Okhttp現(xiàn)在已出到3.4.1版本,主要包括的功能有:

  • 1般的get要求

  • 1般的post要求

  • 基于Http的文件上傳

  • 文件下載

  • 加載圖片

  • 支持要求回調(diào),直接返回對(duì)象、對(duì)象集合

  • 支持session的保持

下面我們介紹1下Okhttp的簡(jiǎn)單使用:

使用

使用Okhttp需要在項(xiàng)目的gradle文件中導(dǎo)入包,直接添加以下代碼:

 compile 'com.squareup.okhttp3:okhttp:3.4.1'

不過(guò)建議先去okhttp的github上查看最新的版本,okhttp的github地址是:https://github.com/square/okhttp

使用Eclipse的話需要下載相應(yīng)的JAR包,也能夠到上述地址下載。

還有需要在清單文件中添加聯(lián)網(wǎng)的權(quán)限

 <uses-permission android:name="android.permission.INTERNET"/>

完成準(zhǔn)備工作以后,我們就而已開(kāi)始使用這個(gè)網(wǎng)絡(luò)框架了,下面我們通過(guò)具體的例籽實(shí)現(xiàn)以下okhttp的各種功能:

實(shí)現(xiàn)異步GET要求

    //異步get要求
    findViewById(R.id.tv_async_get).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            OkHttpClient okHttpClient = new OkHttpClient();
            Request.Builder builder = new Request.Builder();
            Request request = builder.url("http://blog.csdn.net/lmj623565791/article/details/49734867").method("GET", null).build();
            Call call = okHttpClient.newCall(request);
            //回調(diào)監(jiān)聽(tīng)
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "異步get要求失敗", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                //    if (response.cacheResponse() != null) {
                //  String str = response.cacheResponse().toString();
                //     Log.i(TAG, "onResponse" + str);
                //   } else {
                //   String str = response.networkResponse().toString();
                //   Log.i(TAG, "onResponse" + str);
                //   }

                    Log.i(TAG, "===============================================================================");
                    String str = response.body().string();
                    Log.i(TAG, "onResponse" + str);
                    Log.i(TAG, "===============================================================================");


                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "異步get要求成功", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });

        }
    });

這里就是構(gòu)建1個(gè)要求回調(diào),不過(guò)回調(diào)不是在主線程,所以不能直接更新UI

實(shí)現(xiàn)同步GET要求

    //同步get要求
    findViewById(R.id.tv_sync_get).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            new Thread(new Runnable() {
                @Override
                public void run() {
                    OkHttpClient okHttpClient = new OkHttpClient();
                    Request.Builder builder = new Request.Builder();
                    Request request = builder.url("http://www.baidu.com").method("GET", null).build();
                    Call call = okHttpClient.newCall(request);
                    try {
                        Response response = call.execute();
                        if (response.isSuccessful()) {

                            Log.i(TAG, "=======================================================");
                            Log.i(TAG, "run" + response.body().string());
                            Log.i(TAG, "=======================================================");
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Log.i(TAG, "同步get要求成功");
                                    Toast.makeText(MainActivity.this, "同步get要求成功", Toast.LENGTH_SHORT).show();
                                }
                            });
                        } else {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Log.i(TAG, "同步get要求失敗");
                                    Toast.makeText(MainActivity.this, "同步get要求失敗", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
            }).start();

        }
    });

同步GET要求和異步GET要求最大的區(qū)分就是調(diào)用不同的方法,同步調(diào)用的是execute,而異步調(diào)用的是enqueue,網(wǎng)絡(luò)要求不能主線程中。

實(shí)現(xiàn)異步POST要求

客戶端代碼:

    //異步post要求
    findViewById(R.id.tv_async_post).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            OkHttpClient okHttpClient = new OkHttpClient();
            RequestBody formBody = new FormBody.Builder().add("username", "zhangsan")
                    .add("password", "zhangsan").build();
            Request resuest = new Request.Builder().post(formBody).url("http://192.168.0.218:8080/sayHello").build();
            Call call = okHttpClient.newCall(resuest);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "服務(wù)器沒(méi)法連接", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "post要求成功", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });
        }
    });

服務(wù)器端:

服務(wù)器端我是用Intelij IDEA2016寫的,就是簡(jiǎn)單實(shí)現(xiàn)上傳兩個(gè)字符串而已,代碼也非常簡(jiǎn)單。

實(shí)現(xiàn)異步下載文件

    //異步下載文件
    findViewById(R.id.tv_async_download_file).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            OkHttpClient okHttpClient = new OkHttpClient();
            Request request = new Request.Builder().url("http://192.168.0.218:8080/okhttp⑶.4.1.jar").build();
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "下載失敗,請(qǐng)稍后重試", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    InputStream inputStream = response.body().byteStream();
                    FileOutputStream fileOutputStream = null;
                    fileOutputStream = new FileOutputStream(new File("/sdcard/okhttp⑶.4.1.jar"));
                    byte[] bytes = new byte[1024];
                    int len = 0;
                    while ((len = inputStream.read(bytes)) != ⑴) {
                        fileOutputStream.write(bytes, 0, len);
                    }
                    fileOutputStream.flush();
                    Log.i(TAG, "onResponse----->>文件下載成功");

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "文件下載成功", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });

        }
    });

實(shí)現(xiàn)的效果以下:

實(shí)現(xiàn)異步上傳文件

        //異步上傳文件
    findViewById(R.id.tv_async_upload_file).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MediaType mime = MediaType.parse("application/java-archive;charset=utf⑻");
            String url = "http://192.168.0.218:8080/upload";
            OkHttpClient okHttpClient = new OkHttpClient();
            File file = new File("/sdcard/okhttp⑶.4.1.jar");
            Request request = new Request.Builder().url(url).post(RequestBody.create(mime, file)).build();
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.i(TAG, "onResponse---->>上傳失敗");
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "文件上傳失敗", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.i(TAG, "onResponse---->>上傳成功");
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "文件上傳成功", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });
        }
    });

文件上傳需要用服務(wù)器接收,這里我是自己寫1個(gè)簡(jiǎn)單的Servlet去接收的,實(shí)際開(kāi)發(fā)肯定會(huì)有服務(wù)器接收的。這里需要注意的是需要設(shè)置文件的MIME類型,如果不知道相應(yīng)后綴名的文件的MIME類型,可以去這里查看1下:http://www.cnblogs.com/linyijia/p/5466317.html

要求超時(shí)設(shè)置

與前面版本不同的是,3.0以后就不再允許直接通過(guò)OkhttpClient設(shè)置超時(shí)了,而是通過(guò)OkHttpClient.Builder設(shè)置,設(shè)置好以后我們可以直接通過(guò)builder.build獲得到1個(gè)OkHttpClient,這樣我們就不再需要new1個(gè)OkHttpClient。請(qǐng)看下面的代碼:

OkHttpClient.Builder builder = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS)
            .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize));
    OkHttpClient mOkHttpClient=builder.build();  

取消要求和簡(jiǎn)單封裝

可以直接調(diào)用call.cancel()取消掉要求,這個(gè)框架的2次封裝網(wǎng)上有很多,這里就不再貼代碼了,關(guān)于這個(gè)框架就簡(jiǎn)單介紹到這里了,推薦幾篇關(guān)于這個(gè)框架的介紹博文:

Android 1個(gè)改良的okHttp封裝庫(kù)

OkHttp3源碼分析

okhttp3與舊版本okhttp的區(qū)分分析

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 中文字幕日韩精品中文区 | 日本一区二区免费看 | 亚洲综合精品一区 | 欧美jizzjizz在线播放 | 国产一区二区三区四区在线观看 | 国产中文久久精品 | 亚洲一二四区性毛片1在线 亚洲一个色 | 免费成年人视频在线观看 | 精品国产一区二区三区2021 | 暖暖在线精品日本中文 | 欧美另类网站 | 免费一区二区三区 | 中文字幕视频在线观看 | 亚洲国产精品欧美综合 | 特级做爰片毛片在线播放 | 亚洲性网站 | 在线播放wwww | 亚洲精品无码专区在线播放 | 18岁禁免费网站 | 一区| 日本欧美一区二区三区乱码 | 亚洲视频免费看 | 亚洲精品综合一二三区在线 | 黑人巨大三根一起进hd | 伊人亚洲综合网成人 | 欧美激情视频二区 | 欧美在线不卡视频 | 久久精品国产99久久久 | 在线高清视频 | 国产精品国产三级国产专区不 | 中文字幕成人在线 | 日韩一区二区精品久久高清 | 中文字幕免费看 | 成年香蕉大黄美女美女 | 国产高清不卡一区二区三区 | 成年人视频在线观看免费 | 亚洲精品视频免费看 | 免费观看h | 亚洲成aⅴ人在线观看 | 亚洲欧美日韩久久一区 | 欧美黑人性受xxxx喷水 |