Android OKHTTP3.4版本封装

OKHTTP是Android目前比较火的请求数据的框架,介绍可以看看官方的http://square.github.io/okhttp/


使用OKHTTP记得关联okio-1.11.0.jar包

OKHTTP得到的数据格式本身就是UTF-8的,如果需要,可以在返回的Response.body进行转换

OKHTTP建议全局只有一个OkHttpClient,如果需要更改初始化参数,可以使用newBuilder来colne新的对象进行初始化设置


OKHTTP有同步和异步的请求方法,这边使用异步请求的方式进行封装


OKHTTP的回调中不能更新UI,因此要自己再封装一层

这里封装有点不满意,如果有更好的,请告诉我一下

package com.example.textdemo;

import java.io.IOException;

import android.os.Handler;
import android.os.Message;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public abstract class CallbackUTF8 implements Callback{
	Handler mHandler;
	
	public CallbackUTF8(Handler mHandler){
		super();
		this.mHandler = mHandler;
	}

	@Override
	public void onFailure(Call arg0, IOException arg1) {
		onFailure(arg1);
	}

	@Override
	public void onResponse(Call arg0, final Response arg1) throws IOException {
		mHandler.post(new Runnable() {
			@Override
			public void run() {
				try {
					onTResponse(arg1, arg1.body().string());
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	
	public abstract void onTResponse(Response response, String utf8);
	
	public abstract void onFailure(IOException arg1);
	
}





下面是对get,还有post的封装

package com.example.textdemo;


import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import android.text.TextUtils;
import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Request.Builder;
import okio.BufferedSink;


/**
 * 
 * @author Administrator
 *
 *
 * 如果要取得返回数据的header,可以在header.headers(),默认返回的字符串就是UTF-8-response.body().string(),get
 * 添加权限
 	<uses-permission android:name="android.permission.INTERNET"/>
    //下面这些事使用到缓存的时候需要用的
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
 *
 */
public class OkHttpUtil {
	private static final String CHARSET_NAME = "UTF-8";
	//懒汉式
	private static OkHttpClient mOkHttpClient;
	//缓存路径
	private static final String FilePath = "OKHTTPCacheFile";
	//缓存大小
	private static final int cacheSize = 10 * 1024 * 1024; // 10 MiB
	//链接缓存时间	单位秒
	private static final int conectTimeout = 10;
	//写入缓存时间	单位秒
	private static final int writeTimeout = 10;
	//读取缓存时间	单位秒
	private static final int readTimeout = 30;
	
	
	private OkHttpUtil(){}
	//初始化
	public static void initOkHttpUtil(){
		if (mOkHttpClient == null){
			synchronized (OkHttpUtil.class) {
				if (mOkHttpClient == null){
					File cacheDirectory = new File(FilePath);
				    Cache cache = new Cache(cacheDirectory, cacheSize);
				    mOkHttpClient = new OkHttpClient().newBuilder()
				    		.cache(cache)		//最好不要更改cache目录
				            .connectTimeout(conectTimeout, TimeUnit.SECONDS)//设置相应时间
				            .writeTimeout(writeTimeout, TimeUnit.SECONDS)
				            .readTimeout(readTimeout, TimeUnit.SECONDS)
				    		.build();
				}
			}
		}
	}
	
	
	
	//TODO 克隆一个client,更改链接时间等参数设置
	public static OkHttpClient OkHttpClientClone(int conTime, int WriteTime, int ReadTime){
		if (mOkHttpClient == null){
			initOkHttpUtil();
		}
		OkHttpClient build = mOkHttpClient.newBuilder()
								.connectTimeout(conTime, TimeUnit.SECONDS)
								.writeTimeout(WriteTime, TimeUnit.SECONDS)
								.readTimeout(ReadTime, TimeUnit.SECONDS)
								.build();
		
		return build;
	}
	
	
	
	
	
	
	/**
	 * 异步请求数据,有回调参数
	 * @param url
	 * @param callback
	 */
	public static void get(String url, CallbackUTF8 callback){
		Request request = new Request.Builder()
                .url(url)
                .build();
		if (mOkHttpClient == null){
			initOkHttpUtil();
		}
		Call newCall = mOkHttpClient.newCall(request);
		newCall.enqueue(callback);
	}
	
	/**
	 * url参数较多时,可以使用map来拼接参数
	 * @param url
	 * @param headerMap
	 * @param callback
	 */
	public static void get(String url, Map<String, String> params, CallbackUTF8 callback){
		String urls = buildParams(url, params);
		get(urls, callback);
	}
	
	
	/**
	 * 带header的get请求 如果url参数比较多,可以传递map,直观点
	 * @param urls
	 * @param params
	 * @param headerMap
	 * @param callback
	 */
	public static void get(String urls, Map<String, String> params, Map<String, String> headerMap, CallbackUTF8 callback){
		String url = buildParams(urls, params);
		Builder builder = new Request.Builder();
		for (String str : headerMap.keySet()) {
			builder.addHeader(str, headerMap.get(str));
		}
		Request request = builder
                .url(url)
                .build();
		if (mOkHttpClient == null){
			initOkHttpUtil();
		}
		Call newCall = mOkHttpClient.newCall(request);
		newCall.enqueue(callback);
	}
	
	
	
	
	
	/**
	 * 简单的post请求
	 * @param url
	 * @param params
	 * @param callback
	 */
	public static void post(String url, Map<String, String> params, CallbackUTF8 callback){
		okhttp3.FormBody.Builder builder = new FormBody.Builder();
		for (String key : params.keySet()) {
			builder.add(key, params.get(key));
		}
		RequestBody body = builder.build();
		Request requeset = new Request.Builder()
							.url(url)
							.post(body)
							.build();
		if (mOkHttpClient == null){
			initOkHttpUtil();
		}
		Call newCall = mOkHttpClient.newCall(requeset);
		newCall.enqueue(callback);
		
	}
	
	
	/**
	 * 提交文件
	 * @param url
	 * @param file
	 * @param callback
	 */
	public void postFile(String url, File file, CallbackUTF8 callback){
		final MediaType MEDIA_TYPE_MARKDOWN
		  = MediaType.parse("text/x-markdown; charset=utf-8");
	    Request request = new Request.Builder()
	        .url(url)
	        .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
	        .build();
		if (mOkHttpClient == null){
			initOkHttpUtil();
		}
		Call newCall = mOkHttpClient.newCall(request);
		newCall.enqueue(callback);
	}
	
	
	/**
	 * 拼接url参数
	 * @param url
	 * @param params
	 * @return
	 */
	public static String buildParams(String url, Map<String, String> params) {
		if (TextUtils.isEmpty(url)) {
			return url;
		}
		if (params == null || params.size() == 0) {
			return url;
		}
		url += "?";
		Set<String> keySet = params.keySet();
		Iterator<String> itr = keySet.iterator();
		while (itr.hasNext()) {
			String key = itr.next();
			url += key + "=" + params.get(key) + "&";
		}
		url = url.substring(0, url.length() - 1);
		return url;
	}
	
	
	
	
	public static void cancelAllCall(){
		if (mOkHttpClient == null){
			return;
		}
		
		
	}
	
	
	
	
	
	
}












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值