Okhttp、Volley和Gson的簡單介紹和配合使用

轉載自:http://www.apkbus.com/home.php?mod=space&uid=784586&do=blog&id=61255

1.okhttp是一個高效的、快速的被谷歌承認的,支持HTTP/2和SPDY
 
volley是一個方便網絡任務庫,能夠負責請求、加載、緩存等同步問題,也能夠處理圖片、JSON、文本操做起來比較簡單
 
gson是JSON序列化和反序列化(以上三個能相互間輕鬆使用主要仍是由於okhttp是谷歌推薦的、volley是谷歌開發的、Gson是谷歌開發的
 
2.okhttp的Get用法:
首先下載jar包,jar包的下載地址我不在發連接!

[代碼]java代碼:

?
01
02
03
04
05
06
07
08
09
10
11
12
OkHttpClient client = new OkHttpClient();
 
  public void execute() throws Exception {
         Request request = new Request.Builder()
                 .url( "http://www.apkbus.com/forum.php" )
                 .build();
         Response response = client.newCall(request).execute();
         if (response.isSuccessful()){
            
             System.out.println(response.body().string());
         }
     }
Android自己不容許UI作網絡線程,要開啓一個子線程;Okhttp支持異步線程並回調返回,上面的方法稍加改動便可:
 

[代碼]java代碼:

?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
private void enqueue(){
         Request request = new Request.Builder()
                 .url( "http://www.apkbus.com/forum.php" )
                 .build();
         client.newCall(request).enqueue( new Callback() {
             @Override
             public void onFailure(Request request, IOException e) {
 
             }
 
             @Override
             public void onResponse(Response response) throws IOException {
                 //NOT UI Thread
                 if (response.isSuccessful()){
                     System.out.println(response.body().string());
                 }
             }
         });
     }
 
Okhttp的post的用法:
 
RequestBody formBody = new FormEncodingBuilder()
    .add("platform", "android")
    .add("name", "chace")
    .add("subject", "乾隆十八掌")
    .build();
 
    Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
 
Response response = client.newCall(request).execute();
    if (response.isSuccessful()) {
        return response.body().string();
    } else {
        throw new IOException("Unexpected code " + response);
    }
 
這個代碼是同步網絡請求,異步就改爲enqueue就好了。
 
這個okhttp和gson的用法是整合於網絡,不過寫的清晰易懂
json串:
{
    "data": [
        {
            "appcontent": "1",
            "appname": "UC瀏覽器",
            "apppackagename": "com.UCMobile",
            "id": 1,
            "remark": "1"
        },
        {
            "appname": "支付寶",
            "apppackagename": "com.alipay.android.app",
            "id": 2
        },
        {
            "appname": "WPS",
            "apppackagename": "cn.wps.moffice_eng",
            "id": 3
        }
    ],
    "msg": "獲取信息列表成功",
    "version": 2
}
 
創建javaBean:
這是數組裏面的屬性:
public class ApkInfo {  
    private String apppackagename;  
    private Integer id;  
    private String appname;  
    private String appcontent;  
    private String remark;  
    public String getApppackagename() {  
        return apppackagename;  
    }  
  
    public void setApppackagename(String apppackagename) {  
        this.apppackagename = apppackagename;  
    }  
  
    public Integer getId() {  
        return id;  
    }  
  
    public void setId(Integer id) {  
        this.id = id;  
    }  
  
    public String getAppname() {  
        return appname;  
    }  
  
    public void setAppname(String appname) {  
        this.appname = appname;  
    }  
  
    public String getAppcontent() {  
        return appcontent;  
    }  
  
    public void setAppcontent(String appcontent) {  
        this.appcontent = appcontent;  
    }  
  
    public String getRemark() {  
        return remark;  
    }  
  
    public void setRemark(String remark) {  
        this.remark = remark;  
    }  
  
    @Override  
    public String toString() {  
        return "ApkInfo [id=" + id + ", remarm="  
                + remark + ", appname=" + appname + ", appcontent=" + appcontent  
                + ", apppackagename=" + apppackagename + "]";  
      
    }  
}  
 
這是外部集合的屬性:
public class PackageListInfo {  
    private String msg;  
    private String version;  
    private List<Object> data;  
  
    public String getMsg() {  
        return msg;  
    }  
      
    public void setMsg(String msg) {  
        this.msg = msg;  
    }  
      
    public String getVersion() {  
        return version;  
    }  
      
    public void setVersion(String version) {  
        this.version = version;  
    }  
      
    public List<Object> getData() {  
        return data;  
    }  
  
    public void setData(List<Object> data) {  
        this.data = data;  
    }  
      
    @Override  
    public String toString() {  
        return "PackageListInfo [version=" + version + ", data=" + data + ", msg=" + msg  
                + "]";  
    }  
  
}  
 
新建一個OKHTTP的管理類get獲得JSON數據,並進行處理。
import android.util.Log;  
import okhttp3.Call;  
import okhttp3.Callback;  
import okhttp3.OkHttpClient;  
import okhttp3.Request;  
import okhttp3.Response;  
  
public class GetApkPackage {  
  
    public static String apkPackageUrl = http://192.168.10.133:8080/getAppInfor;  
      
    public static GetApkPackage install = new GetApkPackage();  
      
    public static ArrayList<String> appList=new ArrayList<String>();  
      
    public void getPackage() {  
        OkHttpClient mOkHttpClient = new OkHttpClient();  
        final Request request = new Request.Builder().url(apkPackageUrl).build();  
        mOkHttpClient.newCall(request).enqueue(new Callback() {  
  
            @Override  
            public void onFailure(Call call, IOException e) {  
                System.out.println("獲取apk列表失敗");  
                Log.d("GetApkPackage", e.getMessage());  
                  
            }  
            @Override  
            public void onResponse(Call call, Response response) throws IOException {  
                String result = response.body().string();  
                System.out.println(result);  
                //InputStream is = response.body().byteStream();  
                //byte[] bytes = response.body().bytes();  
                Gson gson = new Gson();  
                PackageListInfo packlist = gson.fromJson(result,PackageListInfo.class);  
                  
                System.out.println(packlist.getData().toString());  
                List<ApkInfo> apkList = new ArrayList<ApkInfo>();  
                Type type = new TypeToken<ArrayList<ApkInfo>>() {}.getType();  
                apkList = gson.fromJson(packlist.getData().toString(), type);  
                /* 
                Map<String,ApkInfo> apkList = gson.fromJson(packlist.getData().toString(),   
                        new TypeToken<List<ApkInfo>>() {   
                        }.getType()); 
                */  
                if(apkList == null){  
                    System.out.println("apkpackage列表爲空");  
                    return;  
                }  
                for(int i =0;i<apkList.size();i++){    
                      String apkName = apkList.get(i).getApppackagename();  
                      System.out.println(apkName);   
                      appList.add(apkName);  
        
              }   
            }  
        });  
    }  
      
    public static GetApkPackage getInstall(){         
        return install;  
    }  
  
}  
上述代碼中,對JSON數據的處理看起來很簡單,只要new一個GSON實例,而後經過gson.fromJson方法,就可以獲得json數據
[java] view plain copy 在CODE上查看代碼片派生到個人代碼片
Gson gson = new Gson();  
PackageListInfo packlist = gson.fromJson(result,PackageListInfo.class); 
 
OKHTTP發送一個字符串給服務器的實例以下:
[java] view plain copy 在CODE上查看代碼片派生到個人代碼片
public final class PostString {  
  public static final MediaType MEDIA_TYPE_MARKDOWN  
      = MediaType.parse("text/x-markdown; charset=utf-8");  
  
  private final OkHttpClient client = new OkHttpClient();  
  
  public void run() throws Exception {  
    String postBody = ""  
        + "Releases\n"  
        + "--------\n"  
        + "\n"  
        + " * _1.0_ May 6, 2016\n"  
        + " * _1.1_ June 15, 2016\n"  
        + " * _1.2_ August 11, 2016\n";  
  
    Request request = new Request.Builder()  
        .url("https://192.168.10.133:8080/base")  
        .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))  
        .build();  
  
    Response response = client.newCall(request).execute();  
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);  
  
    System.out.println(response.body().string());  
  }  
  
  public static void main(String... args) throws Exception {  
    new PostString().run();  
  }  
}  
 
3.Volley的用法:
Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。
JsonObjectRequest:返回JSON對象。
JsonArrayRequest:返回JsonArray。
StringRequest:返回String,這樣能夠本身處理數據,更加靈活。
 
咱們建立一個StringRequest:
StringRequest stringRequest = new StringRequest("http://www.apkbus.com/forum.php",  
                        new Response.Listener<String>() {  
                            @Override  
                            public void onResponse(String response) {  
                                Log.d("TAG", response);  
                            }  
                        }, new Response.ErrorListener() {  
                            @Override  
                            public void onErrorResponse(VolleyError error) {  
                                Log.e("TAG", error.getMessage(), error);  
                            }  
                        });  
 
這篇主要仍是簡單了介紹了三者的關係和用法
相關文章
相關標籤/搜索