欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開發(fā)之OkHttpUtils的具體使用方法

 更新時(shí)間:2017年08月01日 17:11:40   作者:Coder_wei  
這篇文章主要介紹了Android開發(fā)之OkHttpUtils的具體使用方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

一、概述

之前寫了篇Android OkHttp完全解析 是時(shí)候來了解OkHttp了,其實(shí)主要是作為okhttp的普及文章,當(dāng)然里面也簡單封裝了工具類,沒想到關(guān)注和使用的人還挺多的,由于這股熱情,該工具類中的方法也是劇增,各種重載方法,以致于使用起來極不方便,實(shí)在慚愧。

于是,在這個(gè)周末,抽點(diǎn)時(shí)間對該工具類,進(jìn)行了重新的拆解與編寫,順便完善下功能,盡可能的提升其使用起來的方便性和易擴(kuò)展性。

ok,那么目前,該封裝庫志支持:

  • 一般的get請求
  • 一般的post請求
  • 基于Http的文件上傳
  • 文件下載
  • 上傳下載的進(jìn)度回調(diào)
  • 加載圖片
  • 支持請求回調(diào),直接返回對象、對象集合
  • 支持session的保持
  • 支持自簽名網(wǎng)站https的訪問,提供方法設(shè)置下證書就行
  • 支持取消某個(gè)請求

源碼地址:https://github.com/hongyangAndroid/okhttp-utils

引入:

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);

通過鏈?zhǔn)饺ジ鶕?jù)自己的需要添加各種參數(shù),最后調(diào)用execute(callback)進(jìn)行執(zhí)行,傳入callback則代表是異步。如果單純的execute()則代表同步的方法調(diào)用。

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

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

(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作為請求體傳入到服務(wù)端,例如json字符串。

(4)Post File

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

將file作為請求體傳入到服務(wù)端.

(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);
  }
 });

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

三、對于上傳下載的回調(diào)

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

對于傳入的callback有個(gè)inProgress方法,需要拿到進(jìn)度直接復(fù)寫該方法即可。

四、對于自動解析為實(shí)體類

目前去除了Gson的依賴,提供了自定義Callback的方式,讓用戶自己去解析返回的數(shù)據(jù),目前提供了StringCallback,F(xiàn)ileCallback,BitmapCallback 分別用于返回string,文件下載,加載圖片。

當(dāng)然如果你希望解析為對象,你可以:

public abstract class UserCallback extends Callback<User>
{
 //非UI線程,支持任何耗時(shí)操作
 @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單向認(rèn)證

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

然后調(diào)用

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網(wǎng)站為權(quán)威機(jī)構(gòu)頒發(fā)的證書,不需要以上設(shè)置。自簽名的證書才需要。

六、配置

(1)全局配置

可以在Application中,通過:

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

然后調(diào)用client的各種set方法。

例如:

client.setConnectTimeout(100000, TimeUnit.MILLISECONDS);

(2)為單個(gè)請求設(shè)置超時(shí)

比如涉及到文件的需要設(shè)置讀寫等待時(shí)間多一點(diǎn)。

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

調(diào)用build()之后,可以隨即設(shè)置各種timeOut.

(3)取消單個(gè)請求

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

(4)根據(jù)tag取消請求

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

例如:在Activity中,當(dāng)Activity銷毀取消請求:

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

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

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

七、淺談封裝

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

//創(chuàng)建okHttpClient對象
OkHttpClient mOkHttpClient = new OkHttpClient();
//創(chuàng)建一個(gè)Request
final Request request = new Request.Builder()
    .url("https://github.com/hongyangAndroid")
    .build();
//new call
Call call = mOkHttpClient.newCall(request); 
//請求加入調(diào)度
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();
 }
});

其中主要的差異,其實(shí)就是request的構(gòu)建過程。

我對Request抽象了一個(gè)類: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
 } 

一個(gè)request的構(gòu)建呢,我分三個(gè)步驟:buildRequestBody , wrapRequestBody ,buildRequest這樣的次序,當(dāng)以上三個(gè)方法沒有問題時(shí),我們就拿到了request,然后執(zhí)行即可。

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

對于wrapRequestBody方法呢,可以看到它默認(rèn)基本屬于空實(shí)現(xiàn),主要是因?yàn)椴⒎撬械恼埱箢惗夹枰獜?fù)寫它,只有上傳的時(shí)候呢,需要回調(diào)進(jìn)度,需要對requestBody進(jìn)行包裝,所以這個(gè)方法類似于一個(gè)鉤子。

其實(shí)這個(gè)過程有點(diǎn)類似模板方法模式。

對于更加詳細(xì)的用法,可以查看github上面的readme,以及demo,目前demo包含:

對于上傳文件的兩個(gè)按鈕,需要自己搭建服務(wù)器,其他的按鈕可以直接測試。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 五分了解Android?Progress?Bar進(jìn)度條加載

    五分了解Android?Progress?Bar進(jìn)度條加載

    這篇文章主要為大家介紹了Android?Progress?Bar進(jìn)度條加載的實(shí)現(xiàn)及屬性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Android入門之Handler的使用教程詳解

    Android入門之Handler的使用教程詳解

    這篇文章主要為大家詳細(xì)介紹了Android中Handler機(jī)制的使用,文中的示例代碼講解詳細(xì),有需要的朋友可以借鑒參考下,希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2022-11-11
  • Android 使用ViewPager實(shí)現(xiàn)左右循環(huán)滑動及輪播效果

    Android 使用ViewPager實(shí)現(xiàn)左右循環(huán)滑動及輪播效果

    ViewPager是一個(gè)常用的Android組件,不過通常我們使用ViewPager的時(shí)候不能實(shí)現(xiàn)左右無限循環(huán)滑動,在滑到邊界的時(shí)候會看到一個(gè)不能翻頁的動畫,可能影響用戶體驗(yàn),接下來通過本文給大家介紹Android 使用ViewPager實(shí)現(xiàn)左右循環(huán)滑動及輪播效果,一起看看吧
    2017-02-02
  • Android編程實(shí)現(xiàn)手機(jī)震動功能的方法

    Android編程實(shí)現(xiàn)手機(jī)震動功能的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)手機(jī)震動功能的方法,結(jié)合實(shí)例形式分析了Android實(shí)現(xiàn)手機(jī)震動功能的核心代碼與權(quán)限控制操作技巧,需要的朋友可以參考下
    2017-06-06
  • Android ProductFlavor的使用詳解

    Android ProductFlavor的使用詳解

    如果你的項(xiàng)目需要要區(qū)分國內(nèi)版和國外版甚至還要根據(jù)用戶是否是VIP會員加上收費(fèi)和免費(fèi)的版本,我們可以使用ProductFlavor對UI布局和icon圖標(biāo)進(jìn)行版本區(qū)分,有此類需求的朋友,不妨了解下本文
    2021-06-06
  • flutter升級3.7.3報(bào)錯(cuò)Unable?to?find?bundled?Java?version解決

    flutter升級3.7.3報(bào)錯(cuò)Unable?to?find?bundled?Java?version解決

    這篇文章主要介紹了flutter升級3.7.3報(bào)錯(cuò)Unable?to?find?bundled?Java?version解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加
    2023-02-02
  • Android實(shí)現(xiàn)左滑刪除控件

    Android實(shí)現(xiàn)左滑刪除控件

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)左滑刪除控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Android中圖片的三級緩存機(jī)制

    Android中圖片的三級緩存機(jī)制

    這篇文章主要介紹了Android中圖片的三級緩存機(jī)制的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • Android入門教程之組件Activity的生命周期詳解

    Android入門教程之組件Activity的生命周期詳解

    Activity作為四大組件之一,出現(xiàn)的頻率相當(dāng)高,基本上我們在android的各個(gè)地方都能看見它的蹤影,因此深入了解Activity,對于開發(fā)高質(zhì)量應(yīng)用程序是很有幫助的。今天我們就來詳細(xì)地聊聊Activity的生命周期,以便我們在以后的開發(fā)中能如魚得水
    2021-10-10
  • Android編程之SDK安裝組件的離線安裝方法分享

    Android編程之SDK安裝組件的離線安裝方法分享

    這篇文章主要介紹了Android編程之SDK安裝組件的離線安裝方法,提供了離線sdk的下載地址與下載方法,以及離線安裝的具體操作步驟,需要的朋友可以參考下
    2015-12-12

最新評論