日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android OKHttp的基本使用详解

發布時間:2024/4/15 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android OKHttp的基本使用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天,簡單講講Android里如何使用OKHttp。

?

Android框架系列:

一.android EventBus的簡單使用

二.android Glide簡單使用

三.android OKHttp的基本使用詳解

?

簡單說一下學習okhttp的理由

  • google在Android 6.0中刪除了HttpClient的Api,采用的是則是okhttp
  • 高效的使用HTTP,使應用運行更快更省流量
  • 響應緩存數據避免重復網絡請求
  • 無縫的支持GZIP來減少數據流量
  • 使用非常簡單,請求和響應的Api具有流暢的建造和不變性,同時支持同步異步調用回調函數
  • 如果網絡出現問題,它會從常見的連接問題中恢復
  • 如果服務器配置有多個IP地址,當第一個IP連接失敗,它會嘗試連接下一個IP
  • 一,OKHttp介紹

    okhttp是一個第三方類庫,用于android中請求網絡。

    這是一個開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso和LeakCanary) 。用于替代HttpUrlConnection和Apache HttpClient(android API23 里已移除HttpClient)。

    okhttp有自己的官網,官網網址:OKHttp官網

    如果想了解原碼可以在github上下載,地址是:https://github.com/square/okhttp

    在AndroidStudio中使用不需要下載jar包,直接添加依賴即可:
    compile ‘com.squareup.okhttp3:okhttp:3.4.1’

    下面對以OKHttp3來詳細介紹OKHttp的使用方法。

    二,get請求的使用方法

    使用OKHttp進行網絡請求支持兩種方式,一種是同步請求,一種是異步請求。下面分情況進行介紹。

    1,get的同步請求

    對于同步請求在請求時需要開啟子線程,請求成功后需要跳轉到UI線程修改UI。

    在AndroidManifest.xml添加所需權限

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


    使用示例如下:

    public void getDatasync(){new Thread(new Runnable() {@Overridepublic void run() {try {OkHttpClient client = new OkHttpClient();//創建OkHttpClient對象Request request = new Request.Builder().url("http://www.baidu.com")//請求接口。如果需要傳參拼接到接口后面。.build();//創建Request 對象Response response = null;response = client.newCall(request).execute();//得到Response 對象if (response.isSuccessful()) {Log.d("kwwl","response.code()=="+response.code());Log.d("kwwl","response.message()=="+response.message());Log.d("kwwl","res=="+response.body().string());//此時的代碼執行在子線程,修改UI的操作請使用handler跳轉到UI線程。}} catch (Exception e) {e.printStackTrace();}}}).start(); }

    此時打印結果如下:
    response.code()==200;
    response.message()==OK;
    res=={“code”:200,”message”:success};

    注意事項:
    1,Response.code是http響應行中的code,如果訪問成功則返回200.這個不是服務器設置的,而是http協議中自帶的。res中的code才是服務器設置的。注意二者的區別。
    2,response.body().string()本質是輸入流的讀操作,所以它還是網絡請求的一部分,所以這行代碼必須放在子線程。
    3,response.body().string()只能調用一次,在第一次時有返回值,第二次再調用時將會返回null。原因是:response.body().string()的本質是輸入流的讀操作,必須有服務器的輸出流的寫操作時客戶端的讀操作才能得到數據。而服務器的寫操作只執行一次,所以客戶端的讀操作也只能執行一次,第二次將返回null。

    ?

    2,get的異步請求

    這種方式不用再次開啟子線程,但回調方法是執行在子線程中,所以在更新UI時還要跳轉到UI線程中。
    使用示例如下:

    private void getDataAsync() {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("http://www.baidu.com").build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {if(response.isSuccessful()){//回調的方法執行在子線程。Log.d("kwwl","獲取數據成功了");Log.d("kwwl","response.code()=="+response.code());Log.d("kwwl","response.body().string()=="+response.body().string());}}}); }

    異步請求的打印結果與注意事項與同步請求時相同。最大的不同點就是異步請求不需要開啟子線程,enqueue方法會自動將網絡請求部分放入子線程中執行。

    注意事項:
    1,回調接口的onFailure方法和onResponse執行在子線程。
    2,response.body().string()方法也必須放在子線程中。當執行這行代碼得到結果后,再跳轉到UI線程修改UI。

    ?

    三,post請求的使用方法

    Post請求也分同步和異步兩種方式,同步與異步的區別和get方法類似,所以此時只講解post異步請求的使用方法。
    使用示例如下:

    private void postDataWithParame() {OkHttpClient client = new OkHttpClient();//創建OkHttpClient對象。FormBody.Builder formBody = new FormBody.Builder();//創建表單請求體formBody.add("username","zhangsan");//傳遞鍵值對參數Request request = new Request.Builder()//創建Request 對象。.url("http://www.baidu.com").post(formBody.build())//傳遞請求體.build();client.newCall(request).enqueue(new Callback() {。。。});//回調方法的使用與get異步請求相同,此時略。 }

    看完代碼我們會發現:post請求中并沒有設置請求方式為POST,回憶在get請求中也沒有設置請求方式為GET,那么是怎么區分請求方式的呢?重點是Request.Builder類的post方法,在Request.Builder對象創建最初默認是get請求,所以在get請求中不需要設置請求方式,當調用post方法時把請求方式修改為POST。所以此時為POST請求。

    ?

    四,POST請求傳遞參數的方法總結

    在post請求使用方法中講了一種傳遞參數的方法,就是創建表單請求體對象,然后把表單請求體對象作為post方法的參數。post請求傳遞參數的方法還有很多種,但都是通過post方法傳遞的。下面我們看一下Request.Builder類的post方法的聲明:

    public Builder post(RequestBody body)

    由方法的聲明可以看出,post方法接收的參數是RequestBody 對象,所以只要是RequestBody 類以及子類對象都可以當作參數進行傳遞。FormBody就是RequestBody 的一個子類對象。

    1,使用FormBody傳遞鍵值對參數

    這種方式用來上傳String類型的鍵值對
    使用示例如下:

    private void postDataWithParame() {OkHttpClient client = new OkHttpClient();//創建OkHttpClient對象。FormBody.Builder formBody = new FormBody.Builder();//創建表單請求體formBody.add("username","zhangsan");//傳遞鍵值對參數Request request = new Request.Builder()//創建Request 對象。.url("http://www.baidu.com").post(formBody.build())//傳遞請求體.build();client.newCall(request).enqueue(new Callback() {。。。});//此處省略回調方法。 }

    2,使用RequestBody傳遞Json或File對象

    RequestBody是抽象類,故不能直接使用,但是他有靜態方法create,使用這個方法可以得到RequestBody對象。

    這種方式可以上傳Json對象或File對象。
    上傳json對象使用示例如下:

    OkHttpClient client = new OkHttpClient();//創建OkHttpClient對象。 MediaType JSON = MediaType.parse("application/json; charset=utf-8");//數據類型為json格式, String jsonStr = "{\"username\":\"lisi\",\"nickname\":\"李四\"}";//json數據. RequestBody body = RequestBody.create(JSON, josnStr); Request request = new Request.Builder().url("http://www.baidu.com").post(body).build(); client.newCall(request).enqueue(new Callback() {。。。});//此處省略回調方法。

    上傳File對象使用示例如下:

    OkHttpClient client = new OkHttpClient();//創建OkHttpClient對象。 MediaType fileType = MediaType.parse("File/*");//數據類型為json格式, File file = new File("path");//file對象. RequestBody body = RequestBody.create(fileType , file ); Request request = new Request.Builder().url("http://www.baidu.com").post(body).build(); client.newCall(request).enqueue(new Callback() {。。。});//此處省略回調方法。

    3,使用MultipartBody同時傳遞鍵值對參數和File對象

    這個字面意思是多重的body。我們知道FromBody傳遞的是字符串型的鍵值對,RequestBody傳遞的是多媒體,那么如果我們想二者都傳遞怎么辦?此時就需要使用MultipartBody類。
    使用示例如下:

    OkHttpClient client = new OkHttpClient(); MultipartBody multipartBody =new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("groupId",""+groupId)//添加鍵值對參數.addFormDataPart("title","title").addFormDataPart("file",file.getName(),RequestBody.create(MediaType.parse("file/*"), file))//添加文件.build(); final Request request = new Request.Builder().url(URLContant.CHAT_ROOM_SUBJECT_IMAGE).post(multipartBody).build(); client.newCall(request).enqueue(new Callback() {。。。});

    4,自定義RequestBody實現流的上傳

    在上面的分析中我們知道,只要是RequestBody類以及子類都可以作為post方法的參數,下面我們就自定義一個類,繼承RequestBody,實現流的上傳。
    使用示例如下:
    首先創建一個RequestBody類的子類對象:

    RequestBody body = new RequestBody() {@Overridepublic MediaType contentType() {return null;}@Overridepublic void writeTo(BufferedSink sink) throws IOException {//重寫writeTo方法FileInputStream fio= new FileInputStream(new File("fileName"));byte[] buffer = new byte[1024*8];if(fio.read(buffer) != -1){sink.write(buffer);}} };

    然后使用body對象:

    OkHttpClient client = new OkHttpClient();//創建OkHttpClient對象。 Request request = new Request.Builder().url("http://www.baidu.com").post(body).build(); client.newCall(request).enqueue(new Callback() {。。。});

    以上代碼的與眾不同就是body對象,這個body對象重寫了write方法,里面有個sink對象。這個是OKio包中的輸出流,有write方法。使用這個方法我們可以實現上傳流的功能。

    使用RequestBody上傳文件時,并沒有實現斷點續傳的功能。我可以使用這種方法結合RandomAccessFile類實現斷點續傳的功能。

    ?

    五,設置請求頭

    OKHttp中設置請求頭特別簡單,在創建request對象時調用一個方法即可。
    使用示例如下:

    Request request = new Request.Builder().url("http://www.baidu.com").header("User-Agent", "OkHttp Headers.java").addHeader("token", "myToken").build();

    其他部分代碼略。

    六,下載文件

    在OKHttp中并沒有提供下載文件的功能,但是在Response中可以獲取流對象,有了流對象我們就可以自己實現文件的下載。代碼如下:
    這段代碼寫在回調接口CallBack的onResponse方法中:

    try{InputStream is = response.body().byteStream();//從服務器得到輸入流對象long sum = 0;File dir = new File(mDestFileDir);if (!dir.exists()){dir.mkdirs();}File file = new File(dir, mdestFileName);//根據目錄和文件名得到file對象FileOutputStream fos = new FileOutputStream(file);byte[] buf = new byte[1024*8];int len = 0;while ((len = is.read(buf)) != -1){fos.write(buf, 0, len);}fos.flush();return file;}

    ?

    超時設置,整個程序應使用這一個mOkHttpClient對象

    public static void setTimeout() {mOkHttpClient.newBuilder().connectTimeout(10, TimeUnit.SECONDS)//10秒連接超時.writeTimeout(10, TimeUnit.SECONDS)//10m秒寫入超時.readTimeout(10, TimeUnit.SECONDS)//10秒讀取超時.build(); }

    簡單回顧一下,okhttp可以使用

    private void getDataAsync() {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("http://www.baidu.com").build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {if(response.isSuccessful()){//回調的方法執行在子線程。Log.d("kwwl","獲取數據成功了");Log.d("kwwl","response.code()=="+response.code());Log.d("kwwl","response.body().string()=="+response.body().string());}}}); }

    發生請求,同時指出Get和POST兩種請求方式,結果在Callback里回調回來,記住是子線程,所以不能再回調修改UI.還有文件上傳和下載也比較簡單,具體的代碼大家自己去看。

    ?

    這里提供我學習時寫的OKHttp的Demo:源碼下載

    ?

    android OKHttp的基本使用詳解就講完了。

    ?

    就這么簡單。

    總結

    以上是生活随笔為你收集整理的android OKHttp的基本使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 草莓视频在线观看入口w | 色咪咪网站 | 精产国品一二三产区m553麻豆 | 久久久久高潮 | 欧美精品自拍偷拍 | 国产区av| 丰满肉嫩西川结衣av | 日韩一区二区三区四区在线 | 成人污污视频在线观看 | 久久偷看各类wc女厕嘘嘘偷窃 | 黄色网址在线看 | 有码在线视频 | 国产精品不卡一区 | 性五月天 | 中文字幕9 | 国产精品一国产精品 | 国产黄色在线看 | 成人首页 | 国精产品一区 | 午夜在线观看视频18 | 桃花色综合影院 | 四虎一级片 | 亚洲福利在线观看 | 欧美三级黄 | 国产美女精品久久久 | 国产精品成人av久久 | 久久精品欧美日韩 | 欧美黑人巨大xxx极品 | 三上悠亚亚洲一区 | 中文字幕国产亚洲 | 韩国黄色精品 | av日韩在线免费观看 | 精品人妻一区二区三区含羞草 | 少妇精品无码一区二区三区 | 亚洲精品99| 欧美大片免费观看网址 | 亚洲一区二区黄色 | 成人午夜激情视频 | 日韩av专区片 | aaaaa级少妇高潮大片免费看 | 国产一区二区免费看 | 依依激情网 | 波多野结衣一区二区三区在线观看 | 美女搞黄视频网站 | 黄色片的网站 | 黑人无套内谢中国美女 | 女生被草 | 少妇无内裤下蹲露大唇视频 | 亚洲精品成人区在线观看 | 桃色一区二区三区 | 久热草| 新91视频在线观看 | 不许穿内裤随时挨c调教h苏绵 | 精品人妻一区二区三区蜜桃视频 | 日韩一区二区在线免费观看 | 精精国产xxxx视频在线 | 日韩一级片在线观看 | 狂躁美女大bbbbbb黑人 | 亚洲黄色自拍 | 97在线免费公开视频 | 日本视频不卡 | 高清国产一区二区 | 国产又爽又黄又嫩又猛又粗 | 在线黄av | 大尺度在线观看 | 蜜桃久久一区二区三区 | 中文字幕在线播放一区二区 | 捆绑束缚调教 | 天天做天天爱天天爽综合网 | 日韩人体视频 | 少妇一级淫免费观看 | 91精品婷婷国产综合久久蝌蚪 | 少妇精品一区二区 | 亚洲第一福利网站 | 日韩免费看片 | 女同vk | 久婷婷| 欧美aaa一级片 | 欧美亚洲综合视频 | 午夜久久网 | 久色成人| 噜噜啪啪 | 丰满女邻居的色诱4hd | 国产欧美精品国产国产专区 | 伊人98| 中文久久精品 | 国产美女www | 一级黄色在线播放 | 免费观看a毛片 | av在线免| 可以直接观看的av | 亚洲精品欧美日韩 | 少妇久久久 | 日本五十路 | 日韩精品人妻中文字幕有码 | 欧美xxxx在线 | av福利社 | 一级α片免费看刺激高潮视频 | 国产原创视频在线观看 |