Volley与Retrofit(OKHttp)使用与区别

Volley使用:

   平常我们使用Volley的标准步骤是:

        (1)创建一个RequestQueue队列;

             RequestQueue mQueue = Volley.newRequestQueue(context);  

        (2)创建一个Request对象(当然实际中可能就是Request的子类了,比如:StringRequest、JsonRequest等等);

            StringRequest stringRequest = new StringRequest("http://www.baidu.com",  
                        new Response.Listener() {  
                            @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);  
                            }  
                        });  

        (3)调用RequestQueue的add方法将Request对象添加到请求队列中;

             mQueue.add(stringRequest); 

项目中使用

/**
 * 运单保存
 */
@Override
public void createOrder(Context context, Map, String> postData, final MMInfoListener listener) {
    Map, String> mData = new HashMap<>();

    new NetTask(Request.Method.POST, APIAction.CREATE_ORDER,
            new NetTask.Listener() {
                @Override
                public void onResponse(String response) {
                    JSONObject jsonObj = null;
                    try {
                        jsonObj = new JSONObject(response);
                        int status = jsonObj.getInt("errno");
                        if (status == 0) {
                            MMOrder mmOrderInfo = new MMOrder();
                            mmOrderInfo.fromJson(jsonObj.optJSONObject("data"));
                            listener.onSuccess(mmOrderInfo);
                        } else {
                            listener.onError(jsonObj.optString("errmsg"));
                        }
                    } catch (Exception e) {
                        listener.onError(ERROR_CODE.RESPONSE_ERROR);
                    }
                }
            },
            new NetTask.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    listener.onError(ERROR_CODE.NETWORK_ERROR);
                }
            }, mData, postData).start();
}


NetTask的关键代码

StringRequest stringRequest = new StringRequest(this.method, url, this.mListener, this.mErrorListener, postParams);
// 设置超时时间、重试次数
// stringRequest.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, APIAction.needRetry(this.action) ? 1 : 0, 1.0f));
stringRequest.setRetryPolicy(new DefaultRetryPolicy(initialTimeoutMs, maxNumRetries, 1.0f));
getRequestQueue().cancelAll(flag);
stringRequest.setTag(flag);
getRequestQueue().add(stringRequest);


【volley不支持图片上传   写了一个类MultipartRequest支持】

主要实现是继承volley的Request类,然后通过使用httpmim的MultipartEntity类对文件参数进行封装。

 Retrofit基本用法(未封装)
1.在build.gradle中添加依赖
//okHttp
compile 'com.squareup.okhttp3:okhttp:3.2.0'

//retrofit
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'

2.创建接口,声明API
//Retrofit turns your HTTP API into a Java interface.
//创建接口,声明GitHub的API
public interface GitHubAPI {
     /*
       请求该接口:https://api.github.com/users/baiiu
     */
     @GET("users/{user}") 
     Call userInfo(@Path("user") String user);
}
3.在MainActivity.onCreate()方法中调用
/*
1.初始化OkHttpClient
*/
OkHttpClient client = new OkHttpClient();

/*
2.创建Retrofit
*/
retrofit = new Retrofit.Builder()
        //设置OKHttpClient
        .client(client)
        //设置baseUrl,注意,baseUrl必须后缀"/"
        .baseUrl("https://api.github.com/")

        //添加Gson转换器
        .addConverterFactory(GsonConverterFactory.create())
        .build();

/*
2.获取GitHub的API
*/
GitHubAPI gitHubAPI = retrofit.create(GitHubAPI.class);

/*
3.异步调用
*/
Call userCall = gitHubAPI.userInfo("baiiu");
userCall.enqueue(new Callback() {
      @Override public void onResponse(Call call, Response response) {
        User body = response.body();
        LogUtil.d(body == null ? "body == null" : body.toString());
      }

      @Override public void onFailure(Call call, Throwable t) {
        /*
         判断是否被cancel掉了
        */
        if (call.isCanceled()) {
          LogUtil.d("the call is canceled , " + toString());
        } else {
          LogUtil.e(t.toString());
        }
      }
    });

/*
取消调用
*/
//userCall.cancel();

【项目封装使用】

/**
 * 开单详情
 *
 * @param od_link_id
 * @param callback   oinfo_app是模版需要字段
 */
@Override
public void fetchWaybillInfo(String od_link_id, String queryNum, MMCallback callback) {
    JsonObject jsonObject = new JsonObject();
    jsonObject.addProperty("od_link_id", TextUtils.isEmpty(od_link_id) ? "" : od_link_id);
    jsonObject.addProperty("query_num", TextUtils.isEmpty(queryNum) ? "" : queryNum);
    WaybillDetailMVP.Service waybillDetail = NetTask.getInstance().create(WaybillDetailMVP.Service.class);

    waybillDetail.fetchWaybillInfo(jsonObject.toString(), "oinfo_app")
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(NetTask.getInstance().onSubscriber(callback));
}



private NetTask() {
  mOkHttpClient = new OkHttpClient.Builder().retryOnConnectionFailure( false) .addInterceptor( new NetInterceptor()) .connectTimeout( TIME_OUT , TimeUnit. SECONDS) .readTimeout( TIME_OUT , TimeUnit. SECONDS) .writeTimeout( TIME_OUT , TimeUnit. SECONDS) .cookieJar( new CookieJar() { @Override public void saveFromResponse(HttpUrl httpUrl , List list) { String host = String. format( "%s://%s:%d" , httpUrl.scheme() , httpUrl.host() , httpUrl.port()) ; List cookies = new ArrayList<>(list) ; mCookieStore.put(host , cookies) ; saveCookies() ; } @Override public List loadForRequest(HttpUrl httpUrl) { String host = String. format( "%s://%s:%d" , httpUrl.scheme() , httpUrl.host() , httpUrl.port()) ; List cookies = mCookieStore.get(host) ; return cookies != null ? cookies : new ArrayList() ; } }) .build() ;}}

public <T> T create(Class<T> service) {
    if (mRetrofit == null) {
        mRetrofit = new Retrofit.Builder().baseUrl(mBaseURL)
                                          .client(mOkHttpClient)
                                          .addConverterFactory(ScalarsConverterFactory.create())
                                          .addConverterFactory(GsonConverterFactory.create())
                                          .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                                          .build();
    }

    return mRetrofit.create(service);
}


【之间区别】

OkHttp

功能介绍
Square 公司开源的 OkHttp 是一个专注于连接效率的 HTTP 客户端。OkHttp 提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。
优点
1.支持http请求,https请求。
2.支持文件下载。
3.基于Http的文件上传。
4.加载图片。
缺点
比如callback回来是在线程里面, 不能刷新UI,需要我们手动处理。
封装比较麻烦。

Volley

功能简述
Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的。Volley 的特点:特别适合数据量小,通信频繁的网络操作。
优点
1.非常适合进行数据量不大,但通信频繁的网络操作。
2.内部分装了异步线程。
3.可直接在主线程调用服务端并处理返回结果。
缺点
1.对大文件下载 Volley的表现非常糟糕。
2.只支持http请求。
3.图片加载性能一般。



http://blog.csdn.net/hwz2311245/article/details/46845271

你可能感兴趣的:(Android,移动开发)