您的位置:首页 > 理论基础 > 计算机网络

OKHttp 请求库

2016-05-25 16:31 447 查看
Hongyang详解:http://blog.csdn.net/lmj623565791/article/details/47911083

大牛已经封装了一个很棒的工具类了,有兴趣可以去学习,但是这里还是贴上自己封装的(^~^):

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;
import com.example.mytoolutils.utils.LogUtils;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;

/**
* okhttp 封装工具类<BR/>
* okHttp: OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存。
* 默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题。
* 如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。
An HTTP & SPDY client for Android and Java applications
从Android4.4开始HttpURLConnection的底层实现采用的是okHttp.
使用要求:对于Android:2.3以上,对于Java:java7以上 两个模块:
okhttp-urlconnection实现.HttpURLConnection API; okhttp-apache实现Apache HttpClient API.
依赖:okio(https://github.com/square/okio): Okio, which OkHttp uses for fast I/O and resizable buffers.
*/
public class OkHttpUtils {
private static OkHttpUtils instance;
private static OkHttpClient okHttpClient;
/**
* 异步请求
*/
public static String OKHTTP_UTILS_REQUEST_ASYNC="OkHttpUtils_OkHttp_Async_Method";
/**
* 同步请求
*/
public static String OKHTTP_UTILS_REQUEST_UI="OkHttpUtils_OkHttp_UI_Method";
/**
* string 类型
*/
public static String OKHTTP_UTILS_REQUEST_STRING="OkHttpUtils_OkHttp_String_Method";
/**
* json类型
*/
public static String OKHTTP_UTILS_REQUEST_JSON="OkHttpUtils_OkHttp_Json_Method";
/**
* file类型
*/
public static String OKHTTP_UTILS_REQUEST_FILE="OkHttpUtils_OkHttp_File_Method";
/**
* 返回bitmap类型
*/
public static String OKHTTP_UTILS_REQUEST_RESULT_BITMAP="OkHttpUtils_OkHttp_Result_Bitmap_Type";
/**
* 返回file类型
*/
public static String OKHTTP_UTILS_REQUEST_RESULT_FILE="OkHttpUtils_OkHttp_Result_File_Type";
/**
* 返回string类型
*/
public static String OKHTTP_UTILS_REQUEST_RESULT_STRING="OkHttpUtils_OkHttp_Result_String_Type";
/**
* 返回未知类型
*/
public static String OKHTTP_UTILS_REQUEST_RESULT_UNKNOWN="OkHttpUtils_OkHttp_Result_Unknown_Type";
public static OkHttpUtils getInstance(){
if(instance==null){
synchronized (OkHttpUtils.class) {
if(instance==null){
instance=new OkHttpUtils();
}
}
}
if(okHttpClient==null){
okHttpClient=new OkHttpClient();
okHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);//联网超时
okHttpClient.setWriteTimeout(10, TimeUnit.SECONDS);//写入超时
okHttpClient.setReadTimeout(30, TimeUnit.SECONDS);//读取超时
}
return instance;
}
/**
* 请求处理接口
*/
public interface OkHttpUtilsCallback{
void Success(Object arg0);
void Failure(Object...objects);
}
/**
* 同步或者异步get请求
* @param path
* @param callback
* @param method
* OKHTTP_UTILS_REQUEST_ASYNC 异步  OKHTTP_UTILS_REQUEST_UI 同步
* @param resultType 返回结果类型
*/
public void StartAsyncOrUIGetRequest(String path,final OkHttpUtilsCallback callback,String method,String resultType){
Request request=new Request.Builder().url(path).build();
if(method==null||method.equals(OKHTTP_UTILS_REQUEST_ASYNC)){
okHttpClient.newCall(request).enqueue(new MCallback(callback,resultType).okCallback);//异步
}else{
try {
Response response=okHttpClient.newCall(request).execute(); //同步
DisposeResponse(callback, response,resultType);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 同步或者异步post请求 提交键值对
* @param path
* @param map post参数  null则return
* @param callback
* @param method
* OKHTTP_UTILS_REQUEST_ASYNC 异步  OKHTTP_UTILS_REQUEST_UI 同步
* @param resultType 返回结果类型
*/
public void StartAsyncOrUIPostRequestUploadMap(String path,HashMap<String,Object>map,OkHttpUtilsCallback callback,String method,String resultType){
Request request=null;
if(map!=null){
FormEncodingBuilder fBody=new FormEncodingBuilder();
Iterator iterator=map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry entry=(Entry) iterator.next();
fBody.add((String)entry.getKey(), (String) entry.getValue());
}
RequestBody body=fBody.build();
request=new Request.Builder().url(path).post(body).build();
}else{
return;
}
if(method==null||method.equals(OKHTTP_UTILS_REQUEST_ASYNC)){
okHttpClient.newCall(request).enqueue(new MCallback(callback,resultType).okCallback);
}else{
try {
Response response=okHttpClient.newCall(request).execute();
DisposeResponse(callback, response,resultType);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static final MediaType JSON=MediaType.parse("application/json; charset=utf-8");
private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
/**
* 同步或者异步post方式提交数据(json file string )
* @param path URL
* @param type  <P>
* OKHTTP_UTILS_REQUEST_JSON <P>
* OKHTTP_UTILS_REQUEST_STRING<P>
* OKHTTP_UTILS_REQUEST_FILE<P>
* @param string  需要提交的内容  file时为文件地址
* @param callback
* @param method   OKHTTP_UTILS_REQUEST_ASYNC 异步  OKHTTP_UTILS_REQUEST_UI 同步
* @param resultType 返回结果类型
*/
public void StartAsyncOrUIPostRequestUploadObject(String path,String type,String string,OkHttpUtilsCallback callback,String method,String resultType){
Request request=null;
if(string!=null){
RequestBody body=null;
if(type.equals(OKHTTP_UTILS_REQUEST_JSON)){
body=RequestBody.create(JSON, string);
}else if(type.equals(OKHTTP_UTILS_REQUEST_STRING)){
body=RequestBody.create(MEDIA_TYPE_MARKDOWN, string);
}else if(type.equals(OKHTTP_UTILS_REQUEST_FILE)){
File file=new File(string);
body=RequestBody.create(MEDIA_TYPE_MARKDOWN, file);
}
request=new Request.Builder().url(path).post(body).build();
}else{
return;
}
if(method==null||method.equals(OKHTTP_UTILS_REQUEST_ASYNC)){
okHttpClient.newCall(request).enqueue(new MCallback(callback,resultType).okCallback);
}else{
try {
Response response=okHttpClient.newCall(request).execute();
DisposeResponse(callback, response,resultType);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 处理请求结果
* @param callback
* @param response
* @param resultType 返回类型
*/
private void DisposeResponse(OkHttpUtilsCallback callback,Response response, String resultType){
if(response.isSuccessful()){
DealWith(callback, response, resultType);
}else{
callback.Failure();
}
}
@SuppressWarnings("resource")
private void DealWith(OkHttpUtilsCallback callback, Response response, String resultType) {
try {
if(resultType.equals(OKHTTP_UTILS_REQUEST_RESULT_BITMAP)){
InputStream inputStream=response.body().byteStream();
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds=false;
inputStream.reset();
Bitmap bitmap=BitmapFactory.decodeStream(inputStream,null,options);
callback.Success(bitmap);
inputStream.close();
}else if(resultType.equals(OKHTTP_UTILS_REQUEST_RESULT_STRING)){
callback.Success(response.body().toString());
}else if(resultType.equals(OKHTTP_UTILS_REQUEST_RESULT_FILE)){
byte[]bs=new byte[1024];
FileOutputStream foStream=null;
InputStream iStream= response.body().byteStream();
File file=new File(Environment.getExternalStorageDirectory(),"okhttputilsdownload");
if(file.exists()){
file.delete();
file.createNewFile();
}
foStream=new FileOutputStream(file);
int len=0;
while((len=iStream.read(bs))!=-1){
foStream.write(bs, 0, len);
}
foStream.flush();
//返回文件地址
callback.Success(Environment.getExternalStorageDirectory()+"okhttputilsdownload");
}else if(resultType.equals(OKHTTP_UTILS_REQUEST_RESULT_UNKNOWN)){
callback.Success(response);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//--------------------------------------------
private class MCallback{
private OkHttpUtilsCallback callback;
private String resultType;
@SuppressWarnings("unused")
public MCallback(OkHttpUtilsCallback callback,String resultType) {
this.callback=callback;
this.resultType=resultType;
}
Callback okCallback=new Callback() {

@Override
public void onResponse(Response response) throws IOException {
DealWith(callback, response, resultType);
}

@Override
public void onFailure(Request arg0, IOException arg1) {
callback.Failure();
}
};
}
}


应用:

import java.io.IOException;
import com.example.mytoolutils.MyAppliation;
import com.example.mytoolutils.R;
import com.example.mytoolutils.utils.LogUtils;
import com.example.mytoolutils.utils.framework.OkHttpUtils;
import com.example.mytoolutils.utils.framework.OkHttpUtils.OkHttpUtilsCallback;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class OKHttpActivity extends Activity implements OnClickListener {
private TextView okhttptext;
private ImageView okhttpbitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_okhttp);
okhttptext=(TextView) findViewById(R.id.okhttptext);
okhttpbitmap=(ImageView) findViewById(R.id.okhttpbitmap);
findViewById(R.id.okhttp).setOnClickListener(this);
init();
}

private void init() {
OkHttpClient client=new OkHttpClient();
Request request= new Request.Builder().url("http://blog.csdn.net/lmj623565791/article/details/47911083").build();
client.newCall(request).enqueue(new Callback() {

@Override
public void onResponse(Response arg0) throws IOException {

}

@Override
public void onFailure(Request arg0, IOException arg1) {
// TODO Auto-generated method stub

}
});
}

private void initview() {
OkHttpUtils.getInstance().StartAsyncOrUIGetRequest
("http://www.tudou.com/albumplay/VBRDC1K398w/i6ZO0tnJcVc.html?FR=LIAN",
callback, OkHttpUtils.OKHTTP_UTILS_REQUEST_ASYNC, OkHttpUtils.OKHTTP_UTILS_REQUEST_RESULT_UNKNOWN);
}
OkHttpUtilsCallback callback=new OkHttpUtilsCallback() {

@Override
public void Success(final Object arg0) {
runOnUiThread(new Runnable() {
public void run() {
if(arg0 instanceof Bitmap){
okhttpbitmap.setImageBitmap((Bitmap) arg0);
}else if(arg0 instanceof String){
okhttptext.setText(arg0.toString());
}
}
});
}

@Override
public void Failure(Object... objects) {

}
};
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.okhttp:
new Thread(new Runnable() {
public void run() {
initview();
}
}).start();
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: