<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一、OKHttp介紹

      okhttp是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso和LeakCanary) 。用于替代HttpUrlConnection和Apache HttpClient(android API23 里已移除HttpClient)。okhttp有自己的官網,源碼可以在github上下載。

      二、優勢

      • 允許連接到同一個主機地址的所有請求,提高請求效率
      • 共享Socket,減少對服務器的請求次數
      • 通過連接池,減少了請求延遲
      • 緩存響應數據來減少重復的網絡請求
      • 減少了對數據流量的消耗
      • 自動處理GZip壓縮

      三、功能

      • get,post請求
      • 文件的上傳下載
      • 加載圖片(內部會圖片大小自動壓縮)
      • 支持請求回調,直接返回對象、對象集合
      • 支持session的保持

      四、使用步驟

      1.添加網絡權限

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

      2.引入okhttp

      implementation 'com.squareup.okhttp3:okhttp:4.10.0'
      

      五、get請求

      get請求支持兩種方式,一種是同步請求,一種是異步請求。

      1.同步請求

      同步請求時,需要開啟子線程,使用示例如下:

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

      備注:

      1.response.body().string()是輸入流的讀操作,還是網絡請求的一部分,所以這行代碼必須放在子線程。

      2.response.body().string()只能調用一次,在第一次時有返回值,第二次再調用時將會返回null。因為這是輸入流的讀操作,必須有服務器輸出流的寫操作時客戶端的讀操作才能得到數據。而服務器的寫操作只執行一次,所以客戶端的讀操作也只能執行一次,第二次將返回null。

      2.異步請求

      異步請求不用開啟子線程,但回調方法是執行在子線程中,所以在更新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() {
              @Override
              public void onFailure(Call call, IOException e) {
              }
              @Override
              public void onResponse(Call call, Response response) throws IOException {
                  if(response.isSuccessful()){//回調的方法執行在子線程。
                      Log.d("rain","success");
                      Log.d("rain","response.code()=="+response.code());
                      Log.d("rain","response.body().string()=="+response.body().string());
                  }
              }
          });
      }
      

      備注:

      1.enqueue方法會自動將網絡請求部分放入子線程中執行,異步請求不需要開啟子線程。

      2.onFailure和onResponse執行在子線程。

      3.response.body().string()必須放在子線程中,當執行這行代碼得到結果后,再跳轉到UI線程修改UI。

      六、post請求

      1.同步請求

      同步請求時,需要開啟子線程,使用示例如下:

      public void postDataSync(){
          new Thread(new Runnable() {
              @Override
              public void run() {
                  try {
                  String url = "http://www.xxx.com/api/test";
                  OkHttpClient client = new OkHttpClient();
                  MediaType mediaType = MediaType.parse("application/json;charset=UTF-8");
                  String post = "{\"test\":123}";
                  RequestBody requestBody = RequestBody.create(mediaType, post);
                  Request request = new Request.Builder()
                          .post(requestBody)
                          .url(url)
                          .build();
                  Response response = client.newCall(request).execute();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          }).start();
      }
      

      2.異步請求

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

          private void postDataAsync() {
              String url = "http://www.xxx.com/api/test";
              OkHttpClient client = new OkHttpClient();
              MediaType mediaType = MediaType.parse("application/json;charset=UTF-8");
              String post = "{\"test\":123}";
              RequestBody requestBody = RequestBody.create(mediaType, post);
              Request request = new Request.Builder()
                      .post(requestBody)
                      .url(url)
                      .build();
      
              client.newCall(request).enqueue(new Callback() {
                  @Override
                  public void onFailure(@NonNull Call call, @NonNull IOException e) {
      
                  }
      
                  @Override
                  public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
      
                  }
              });
          }
      

      七、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() {
                  @Override
                  public void onFailure(@NonNull Call call, @NonNull IOException e) {
      
                  }
      
                  @Override
                  public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
      
                  }
              });
      }
      

      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() {
                  @Override
                  public void onFailure(@NonNull Call call, @NonNull IOException e) {
      
                  }
      
                  @Override
                  public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
      
                  }
              });
      

      上傳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() {
                  @Override
                  public void onFailure(@NonNull Call call, @NonNull IOException e) {
      
                  }
      
                  @Override
                  public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
      
                  }
              });
      

      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() {
                  @Override
                  public void onFailure(@NonNull Call call, @NonNull IOException e) {
      
                  }
      
                  @Override
                  public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
      
                  }
              });
      

      4.自定義RequestBody實現流的上傳
      只要是RequestBody類以及子類都可以作為post方法的參數,可以自定義一個類,繼承RequestBody,實現流的上傳。
      使用示例如下:

      //首先創建一個RequestBody類的子類對象
      RequestBody body = new RequestBody() {
          @Override
          public MediaType contentType() {
              return null;
          }
        
          @Override
          public 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() {
                  @Override
                  public void onFailure(@NonNull Call call, @NonNull IOException e) {
      
                  }
      
                  @Override
                  public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
      
                  }
              });
      

      以上代碼的與眾不同就是body對象,這個body對象重寫了write方法,里面有個sink對象。這個是okio包中的輸出流,有write方法。使用這個方法我們可以實現上傳流的功能。使用RequestBody上傳文件時,并沒有實現斷點續傳的功能。可以使用這種方法結合RandomAccessFile類實現斷點續傳的功能。

      八.設置請求頭

      在創建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;
      }
      
      posted on 2022-07-26 19:25  廣坤山貨  閱讀(833)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 中牟县| 国产成人无码A区在线观看视频| 国产一区二区午夜福利久久| 亚洲电影在线观看| 国内揄拍国内精品少妇国语| 欧美性受xxxx黑人猛交| 人人澡人人透人人爽| 亚洲人成网网址在线看| 亚洲欭美日韩颜射在线二| 绝顶丰满少妇av无码| 成人一区二区不卡国产| 疯狂做受xxxx高潮欧美日本 | 免费黄色大全一区二区三区| 日本一道一区二区视频| 国产三级国产精品久久成人| 部精品久久久久久久久| 国产国亚洲洲人成人人专区| 国产精品一二三中文字幕| 无套内谢少妇毛片在线| av亚洲在线一区二区| 亚洲av成人午夜福利| 人妻av中文字幕无码专区| 农村乱色一区二区高清视频| 国语精品国内自产视频| 中文字幕亚洲综合第一页| 日韩人妻精品中文字幕| 一边吃奶一边做动态图| 老司机性色福利精品视频| 黑色丝袜脚交视频麻豆| 亚洲国产精品午夜福利| 日韩免费码中文在线观看| 久久精品国产久精国产| 日韩美女亚洲性一区二区| 久久婷婷综合色一区二区| 人妻在线中文字幕| 天天爽夜夜爱| 日韩精品人妻中文字幕| 亚洲日本va午夜在线电影| 一级毛片网| 高清无码18| 亚洲一区二区三区啪啪|