网络处理

来源:互联网 发布:淘宝旅行机票网 编辑:程序博客网 时间:2024/06/11 18:30

2.0 okhttp

  • 主页: https://github.com/square/okhttp
  • 配置: 添加依赖

    <code data-origin="" 
      compile 'com.squareup.okhttp3:okhttp:3.3.1'" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">  compile 'com.squareup.okhttp3:okhttp:3.3.1'
  1. <code data-origin=""
    发送get请求
<code data-origin="" 
<code data-origin="" 
    // get参数两种方式设置:" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">    // get参数两种方式设置:    // 1. 直接拼字符串:    Request request = new Request.Builder()        .url("http://10.0.2.2:8080/demo/query?uid=1234")        .build();    // 2. 使用Uri:    Uri uri = Uri.parse("http://10.0.2.2:8080/market/search")        .buildUpon()        .appendQueryParameter("keyword", "奶粉")        .appendQueryParameter("page", "0")        .appendQueryParameter("pageNum", "10")        .build();    Request request = new Request.Builder()            .url(uri.toString())            .build();    Response response = client.newCall(request).execute();    response.body().string();    // 读取返回数据

<code data-origin=""

<code data-origin="" 
2. 发送post请求

<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
    RequestBody requestBody = new FormBody.Builder()" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">    RequestBody requestBody = new FormBody.Builder()        .add("username", "itcast")   // 添加表单字段和值        .add("password", "itcast")        .build();    //3.0 用FormBody.Builder, 2.0 用FormEncodingBuilder  Request request = new Request.Builder()      .post(requestBody)      .url("http://10.0.2.2:8080/market/register")      .build();

<code data-origin=""

<code data-origin="" 
<code data-origin="" 
3. 注意问题

<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
// 在Ondestroy里面取消请求:" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">// 在Ondestroy里面取消请求:call.cancel();    //同步请求:    //直接在主线程里面发送网络请求, 会引发Exception    httpClient.newCall(request).execute()    //异步请求:    httpClient.newCall(request).enqueue(callback)

<code data-origin=""

<code data-origin="" 
<code data-origin="" 
**4. 如果想继续使用apache库:
android {
useLibrary ‘org.apache.http.legacy’
}

<code data-origin=""
<code data-origin="" 
<code data-origin="" 
2.1 Volley

  • <code data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    主页:https://android.googlesource.com/platform/frameworks/volley/

  • <code data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    特点:

    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      通信更快,更简单
    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      支持网络请求的排序,优先级处理
    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      支持网络请求的缓存
    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      多级别的取消请求
    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      扩展性强
  • <code data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    使用步骤:

    1. <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      创建RequestQueue
    2. <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      创建Request
    3. <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      添加Request到RequestQueue
    4. <code data-origin=""

      <code data-origin="" 
      <code data-origin="" 
      request.setTag设置标签,可以用于取消请求(如果在队列里面还没有发送的话)

      <code data-origin=""

      <code data-origin="" 
      <code data-origin="" 
      get请求的参数需要拼接到url后面
      post请求参数覆写getParams方法
      header参数覆写getHeaders方法

  • <code data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    使用volley加载图片:

    1. <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      实现ImageLoader
  • <code data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    注意事项:

    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      Volley仅适合用于通信频繁数据量小的网络操作
    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      大数据量的网络操作并不适合Volley
  • <code data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    如何选择:
    http://stackoverflow.com/questions/16902716/comparison-of-android-networking-libraries-okhttp-retrofit-volley

    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      AsyncTask的缺陷:无法取消线程的执行,使用比较麻烦
    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      Volley = Retrofit + Picasso
    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      Picasso很容易集成进已有的代码,Volley对已有的代码改动比较大
    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      Picasso的性能要好一些
  • <code data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    Volley在内存处理方面比Retrofit+Picasso要好一些。

<code data-origin=""

<code data-origin="" 
<code data-origin="" 
AsyncTask取消问题:

<code data-origin=""

<code data-origin="" 
<code data-origin="" 
如果的doInBackground()有不可打断的方法, cancel是不管用的
如果在doInBackground()方法中有一个循环操作,我们应该在循环中使用isCancelled()来判断:

<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
<code data-origin="" 
 protected Object doInBackground(Object... x) {" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> protected Object doInBackground(Object... x) {    while (/* 循环条件 */) {        if (isCancelled()) break;    }    return null; }

<code data-origin=""

<code data-origin="" 
<code data-origin="" 
http://stackoverflow.com/questions/4748964/android-cancel-asynctask-forcefully
http://stackoverflow.com/questions/6039158/android-cancel-async-task
http://droidyue.com/blog/2014/11/08/bad-smell-of-asynctask-in-android/index.html

<code data-origin=""
<code data-origin="" 
<code data-origin="" 
2.2 Retrofit

  • <code data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    主页: https://github.com/square/retrofit
  • <code data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    功能:
    • 效率非常高
    • 可以直接将结果转换称Java类
    • 主要是配合rxJava一起使用
  • <code data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    配置:

    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      添加Retrofit依赖: compile ‘com.squareup.retrofit2:retrofit:2.1.0’
    • <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      添加数据解析依赖,根据实际情况进行选择
      • Gson : com.squareup.retrofit2:converter-gson:2.1.0
      • Jackson : com.squareup.retrofit2:converter-jackson:2.0.2
      • Moshi : com.squareup.retrofit2:converter-moshi:2.0.2
      • Protobuf : com.squareup.retrofit2:converter-protobuf:2.0.2
      • Wire : com.squareup.retrofit2:converter-wire:2.0.2
      • Simple XML : com.squareup.retrofit2:converter-simplexml:2.0.2
  • <code data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    使用步骤:

    1. <code data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      利用GsonFormat插件创建数据模型
    2. <code data-origin=""

      <code data-origin="" 
      <code data-origin="" 
      使用注解设置请求参数和URl

      <code data-origin="" 
      <code data-origin="" 
      <code data-origin="" 
      <code class="java" data-origin="" 
      @GET("/market/favorites")" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">@GET("/market/favorites")public Call<FavoritesResponse> getFavarites(     @Header("userid")String userId,     @Query("page")String page,     @Query("pageNum")String pageNum);@FormUrlEncoded@POST("market/checkout")public Call<CheckOutBean> checkOut(     @Header("userid")String userId,     @Field("sku")String sku);
    3. <code data-origin=""

      <code data-origin="" 
      <code data-origin="" 
      <code class="java" data-origin="" 
      创建Retrofit对象, 并发起请求.示例代码:

      <code data-origin="" 
      <code data-origin="" 
      <code data-origin="" 
      <code class="java" data-origin="" 
      <code class="java" data-origin="" 
      // 构建Retrofit实例" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">// 构建Retrofit实例Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://10.0.2.2:8080/"). .addConverterFactory(GsonConverterFactory.create()) .build();// 创建接口mService = mRetrofit.create(MainService.class);// 发送请求Call<CheckOutBean> call =          mService.checkOut("20428", "1:3:1,3|2:5:1,4"); call.enqueue(new Callback<CheckOutBean>() {     @Override     public void onResponse(             Call<CheckOutBean> call,             Response<CheckOutBean> response) {         CheckOutBean body = response.body();         Log.d(TAG, "onResponse: " + body);     }     @Override     public void onFailure(             Call<CheckOutBean> call, Throwable t) {         Log.e(TAG, "onFailure: ", t);     } });
<code data-origin=""
<code data-origin="" 
<code data-origin="" 
<code class="java" data-origin="" 
<code class="java" data-origin="" 
0 0