亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中OkHttpUtils如何使用

發布時間:2021-06-26 16:49:04 來源:億速云 閱讀:159 作者:Leah 欄目:移動開發

Android中OkHttpUtils如何使用,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

引入:

Android Studio

使用前,對于Android Studio的用戶,可以選擇添加:

compile project(':okhttputils')

或者

compile 'com.zhy:okhttputils:2.0.0'

二、基本用法

目前基本的用法格式為:

OkHttpUtils
 .get()
 .url(url)
 .addParams("username", "hyman")
 .addParams("password", "123")
 .build()
 .execute(callback);

通過鏈式去根據自己的需要添加各種參數,最后調用execute(callback)進行執行,傳入callback則代表是異步。如果單純的execute()則代表同步的方法調用。

可以看到,取消了之前一堆的get重載方法,參數也可以進行靈活的選擇了。

下面簡單看一下,全部的用法:

(1)GET請求

String url = "http://www.csdn.net/";
OkHttpUtils
 .get()
 .url(url)
 .addParams("username", "hyman")
 .addParams("password", "123")
 .build()
 .execute(new StringCallback()
   {
    @Override
    public void onError(Request request, Exception e)
    {

    }

    @Override
    public void onResponse(String response)
    {

    }
   });

(2)POST請求

 OkHttpUtils
 .post()
 .url(url)
 .addParams("username", "hyman")
 .addParams("password", "123")
 .build()
 .execute(callback);

(3)Post String

OkHttpUtils
 .postString()
 .url(url)
 .content(new Gson().toJson(new User("zhy", "123")))
 .build()
 .execute(new MyStringCallback());

將string作為請求體傳入到服務端,例如json字符串。

(4)Post File

OkHttpUtils
 .postFile()
 .url(url)
 .file(file)
 .build()
 .execute(new MyStringCallback());

將file作為請求體傳入到服務端.

(5)基于POST的文件上傳(類似web上的表單)

OkHttpUtils.post()//
 .addFile("mFile", "messenger_01.png", file)//
 .addFile("mFile", "test1.txt", file2)//
 .url(url)
 .params(params)//
 .headers(headers)//
 .build()//
 .execute(new MyStringCallback());

(6)下載文件

OkHttpUtils//
 .get()//
 .url(url)//
 .build()//
 .execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), "gson-2.2.1.jar")//
 {
  @Override
  public void inProgress(float progress)
  {
   mProgressBar.setProgress((int) (100 * progress));
  }

  @Override
  public void onError(Request request, Exception e)
  {
   Log.e(TAG, "onError :" + e.getMessage());
  }

  @Override
  public void onResponse(File file)
  {
   Log.e(TAG, "onResponse :" + file.getAbsolutePath());
  }
 });

(7)顯示圖片

OkHttpUtils
 .get()//
 .url(url)//
 .build()//
 .execute(new BitmapCallback()
 {
  @Override
  public void onError(Request request, Exception e)
  {
   mTv.setText("onError:" + e.getMessage());
  }

  @Override
  public void onResponse(Bitmap bitmap)
  {
   mImageView.setImageBitmap(bitmap);
  }
 });

哈,目前來看,清晰多了。

三、對于上傳下載的回調

new Callback<?>()
{
 //...
 @Override
 public void inProgress(float progress)
 {
  //use progress: 0 ~ 1
 }
}

對于傳入的callback有個inProgress方法,需要拿到進度直接復寫該方法即可。

四、對于自動解析為實體類

目前去除了Gson的依賴,提供了自定義Callback的方式,讓用戶自己去解析返回的數據,目前提供了StringCallback,FileCallback,BitmapCallback 分別用于返回string,文件下載,加載圖片。

當然如果你希望解析為對象,你可以:

public abstract class UserCallback extends Callback<User>
{
 //非UI線程,支持任何耗時操作
 @Override
 public User parseNetworkResponse(Response response) throws IOException
 {
  String string = response.body().string();
  User user = new Gson().fromJson(string, User.class);
  return user;
 }
}

自己使用自己喜歡的Json解析庫完成即可。

解析成List<User>,則如下:

public abstract class ListUserCallback extends Callback<List<User>>
{
 @Override
 public List<User> parseNetworkResponse(Response response) throws IOException
 {
  String string = response.body().string();
  List<User> user = new Gson().fromJson(string, List.class);
  return user;
 }


}

五、對于https單向認證

非常簡單,拿到xxx.cert的證書。

然后調用

OkHttpUtils.getInstance()
  .setCertificates(inputstream);

建議使用方式,例如我的證書放在assets目錄:

/**
 * Created by zhy on 15/8/25.
 */
public class MyApplication extends Application
{
 @Override
 public void onCreate()
 {
  super.onCreate();

  try
  { 
  OkHttpUtils
   .getInstance()
   .setCertificates(getAssets().open("aaa.cer"),
 getAssets().open("server.cer"));
  } catch (IOException e)
  {
   e.printStackTrace();
  }
 }
}

即可。別忘了注冊Application。

注意:如果https網站為權威機構頒發的證書,不需要以上設置。自簽名的證書才需要。

六、配置

(1)全局配置

可以在Application中,通過:

OkHttpClient client = OkHttpUtils.getInstance().getOkHttpClient();

然后調用client的各種set方法。

例如:

client.setConnectTimeout(100000, TimeUnit.MILLISECONDS);

(2)為單個請求設置超時

比如涉及到文件的需要設置讀寫等待時間多一點。

OkHttpUtils
 .get()//
 .url(url)//
 .tag(this)//
 .build()//
 .connTimeOut(20000)
 .readTimeOut(20000)
 .writeTimeOut(20000)
 .execute()

調用build()之后,可以隨即設置各種timeOut.

(3)取消單個請求

 RequestCall call = OkHttpUtils.get().url(url).build();
 call.cancel()

(4)根據tag取消請求

目前對于支持的方法都添加了最后一個參數Object tag,取消則通過OkHttpUtils.cancelTag(tag)執行。

例如:在Activity中,當Activity銷毀取消請求:

OkHttpUtils
 .get()//
 .url(url)//
 .tag(this)//
 .build()//

@Override
protected void onDestroy()
{
 super.onDestroy();
 //可以取消同一個tag的
 OkHttpUtils.cancelTag(this);//取消以Activity.this作為tag的請求
}

比如,當前Activity頁面所有的請求以Activity對象作為tag,可以在onDestory里面統一取消。

七、淺談封裝

其實整個封裝的過程比較簡單,這里簡單描述下,對于okhttp一個請求的流程大致是這樣的:

//創建okHttpClient對象
OkHttpClient mOkHttpClient = new OkHttpClient();
//創建一個Request
final Request request = new Request.Builder()
    .url("https://github.com/hongyangAndroid")
    .build();
//new call
Call call = mOkHttpClient.newCall(request); 
//請求加入調度
call.enqueue(new Callback()
{
 @Override
 public void onFailure(Request request, IOException e)
 {
 }

 @Override
 public void onResponse(final Response response) throws IOException
 {
   //String htmlStr = response.body().string();
 }
});

其中主要的差異,其實就是request的構建過程。

我對Request抽象了一個類:OkHttpRequest

public abstract class OkHttpRequest
{
 protected RequestBody requestBody;
 protected Request request;

 protected String url;
 protected String tag;
 protected Map<String, String> params;
 protected Map<String, String> headers;

 protected OkHttpRequest(String url, String tag,
       Map<String, String> params, Map<String, String> headers)
 {
  this.url = url;
  this.tag = tag;
  this.params = params;
  this.headers = headers;
 }

 protected abstract Request buildRequest();
 protected abstract RequestBody buildRequestBody();

 protected void prepareInvoked(ResultCallback callback)
 {
  requestBody = buildRequestBody();
  requestBody = wrapRequestBody(requestBody, callback);
  request = buildRequest();
 }

 protected RequestBody wrapRequestBody(RequestBody requestBody, final ResultCallback callback)
 {
  return requestBody;
 }


 public void invokeAsyn(ResultCallback callback)
 {
  prepareInvoked(callback);
  mOkHttpClientManager.execute(request, callback);
 }


  // other common methods
 }

一個request的構建呢,我分三個步驟:buildRequestBody , wrapRequestBody ,buildRequest這樣的次序,當以上三個方法沒有問題時,我們就拿到了request,然后執行即可。

但是對于不同的請求,requestBody以及request的構建過程是不同的,所以大家可以看到buildRequestBody ,buildRequest為抽象的方法,也就是不同的請求類,比如OkHttpGetRequest、OkHttpPostRequest等需要自己去構建自己的request。

對于wrapRequestBody方法呢,可以看到它默認基本屬于空實現,主要是因為并非所有的請求類都需要復寫它,只有上傳的時候呢,需要回調進度,需要對requestBody進行包裝,所以這個方法類似于一個鉤子。

其實這個過程有點類似模板方法模式。

看完上述內容,你們掌握Android中OkHttpUtils如何使用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永寿县| 海兴县| 营山县| 马鞍山市| 甘孜县| 丽江市| 江门市| 义马市| 福清市| 阿坝| 连州市| 彰化市| 曲阜市| 石首市| 朔州市| 宜良县| 卢龙县| 舒兰市| 云梦县| 乃东县| 来安县| 原阳县| 旬阳县| 新竹市| 石景山区| 漳州市| 古蔺县| 合阳县| 宜君县| 遵义县| 鹤壁市| 合肥市| 大洼县| 黔南| 宣汉县| 陆丰市| 长泰县| 淮安市| 昭苏县| 东安县| 游戏|