OKhttp的封装(上)
自从介绍了OKhttp3的一些基本使用之后,又偷了下懒,所以它的续篇被搁置了一段时间,现在补充。
OKhttpManager.Class 请求工具类
1 package com.example.administrator.okhttp3; 2 3 import android.os.Handler; 4 import android.os.Looper; 5 6 import java.io.IOException; 7 import java.util.HashMap; 8 import java.util.Map; 9 10 import okhttp3.Call; 11 import okhttp3.Callback; 12 import okhttp3.FormBody; 13 import okhttp3.OkHttpClient; 14 import okhttp3.Request; 15 import okhttp3.RequestBody; 16 import okhttp3.Response; 17 18 /** 19 * Created by ${火龙裸先生} on 2016/9/28. 20 * 邮箱:791335000@qq.com 21 * <p/> 22 * OKhttpManager OKhttp封装类 23 */ 24 public class OKhttpManager { 25 private OkHttpClient client; 26 private static OKhttpManager oKhttpManager; 27 private Handler mHandler; 28 29 /** 30 * 单例获取 OKhttpManager实例 31 */ 32 private static OKhttpManager getInstance() { 33 if (oKhttpManager == null) { 34 oKhttpManager = new OKhttpManager(); 35 } 36 return oKhttpManager; 37 } 38 39 private OKhttpManager() { 40 client = new OkHttpClient(); 41 mHandler = new Handler(Looper.getMainLooper()); 42 } 43 44 45 /************** 46 * 内部逻辑处理 47 ****************/ 48 private Response p_getSync(String url) throws IOException { 49 Request request = new Request.Builder().url(url).build(); 50 Response response = client.newCall(request).execute(); 51 return response; 52 } 53 54 private String p_getSyncAsString(String url) throws IOException { 55 return p_getSync(url).body().string(); 56 } 57 58 private void p_getAsync(String url, final DataCallBack callBack) { 59 final Request request = new Request.Builder().url(url).build(); 60 client.newCall(request).enqueue(new Callback() { 61 @Override 62 public void onFailure(Call call, IOException e) { 63 deliverDataFailure(call, e, callBack); 64 } 65 66 @Override 67 public void onResponse(Call call, Response response) { 68 try { 69 String result = response.body().string(); 70 deliverDataSuccess(result, callBack); 71 } catch (IOException e) { 72 deliverDataFailure(call, e, callBack); 73 } 74 } 75 }); 76 } 77 78 private void p_postAsync(String url, Map<String, String> params, final DataCallBack callBack) { 79 RequestBody requestBody = null; 80 81 if (params == null) { 82 params = new HashMap<String, String>(); 83 } 84 FormBody.Builder builder = new FormBody.Builder(); 85 for (Map.Entry<String, String> entry : params.entrySet()) { 86 String key = entry.getKey().toString(); 87 String value = null; 88 if (entry.getValue() == null) { 89 value = ""; 90 } else { 91 value = entry.getValue().toString(); 92 } 93 builder.add(key, value); 94 } 95 requestBody = builder.build(); 96 final Request request = new Request.Builder().url(url).post(requestBody).build(); 97 client.newCall(request).enqueue(new Callback() { 98 @Override 99 public void onFailure(Call call, IOException e) { 100 deliverDataFailure(call, e, callBack); 101 } 102 103 @Override 104 public void onResponse(Call call, Response response) throws IOException { 105 try { 106 String result = response.body().string(); 107 deliverDataSuccess(result, callBack); 108 } catch (IOException e) { 109 deliverDataFailure(call, e, callBack); 110 } 111 } 112 }); 113 } 114 115 /** 116 * 数据分发的方法 117 */ 118 private void deliverDataFailure(final Call call, final IOException e, final DataCallBack callBack) { 119 mHandler.post(new Runnable() { 120 @Override 121 public void run() { 122 if (callBack != null) { 123 callBack.requestFailure(call, e); 124 } 125 } 126 }); 127 } 128 129 private void deliverDataSuccess(final String result, final DataCallBack callBack) { 130 mHandler.post(new Runnable() { 131 @Override 132 public void run() { 133 if (callBack != null) { 134 callBack.requestSuccess(result); 135 } 136 } 137 }); 138 } 139 140 141 /****************** 142 * 对外公布的方法 143 *****************/ 144 public static Response getSync(String url) throws IOException { 145 return getInstance().p_getSync(url);//同步GET,返回Response类型数据 146 } 147 148 149 public static String getSyncAsString(String url) throws IOException { 150 return getInstance().p_getSyncAsString(url);//同步GET,返回String类型数据 151 } 152 153 public static void getAsync(String url, DataCallBack callBack) { 154 getInstance().p_getAsync(url, callBack);//异步GET请求 155 } 156 157 public static void postAsync(String url, Map<String, String> params, DataCallBack callBack) { 158 getInstance().p_postAsync(url, params, callBack);//异步POST请求 159 } 160 161 /** 162 * 数据回调接口 163 */ 164 public interface DataCallBack { 165 void requestFailure(Call call, IOException e); 166 167 void requestSuccess(String result); 168 } 169 170 }
MainActivity.class 工具类的调用方法
1 package com.example.administrator.okhttp3; 2 3 import android.os.Bundle; 4 import android.support.v7.app.AppCompatActivity; 5 import android.view.View; 6 import android.widget.Button; 7 import android.widget.TextView; 8 9 import java.io.IOException; 10 import java.util.HashMap; 11 import java.util.Map; 12 13 import okhttp3.Call; 14 import okhttp3.OkHttpClient; 15 import okhttp3.Request; 16 import okhttp3.Response; 17 18 public class MainActivity extends AppCompatActivity implements View.OnClickListener { 19 private static OkHttpClient client = new OkHttpClient(); 20 private Request request; 21 private Response response; 22 23 private Button button1, button2, button3, button4; 24 private TextView textView; 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_main); 30 button1 = (Button) findViewById(R.id.btn_one); 31 button2 = (Button) findViewById(R.id.btn_two); 32 button3 = (Button) findViewById(R.id.btn_three); 33 button4 = (Button) findViewById(R.id.btn_four); 34 button1.setOnClickListener(this); 35 button2.setOnClickListener(this); 36 button3.setOnClickListener(this); 37 button4.setOnClickListener(this); 38 textView = (TextView) findViewById(R.id.tv); 39 } 40 41 @Override 42 public void onClick(View view) { 43 switch (view.getId()) { 44 case R.id.btn_one://同步GET 调用方法 45 46 new Thread(new Runnable() { 47 @Override 48 public void run() { 49 try { 50 final String message = OKhttpManager.getSyncAsString("http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=jsonp9"); 51 runOnUiThread(new Runnable() { 52 @Override 53 public void run() { 54 textView.setText(message); 55 } 56 }); 57 } catch (IOException e) { 58 e.printStackTrace(); 59 } 60 } 61 }).start(); 62 63 break; 64 case R.id.btn_two://异步GET 调用方法 65 OKhttpManager.getAsync("http://web.juhe.cn:8080/finance/exchange/rmbquot", new OKhttpManager.DataCallBack() { 66 @Override 67 public void requestFailure(Call call, IOException e) { 68 /** 69 * 加载失败,回调这个方法 70 * */ 71 } 72 73 @Override 74 public void requestSuccess(String result) { 75 textView.setText(result); 76 } 77 }); 78 break; 79 case R.id.btn_three://POST提交表单 调用方法 80 Map<String, String> params = new HashMap<>(); 81 params.put("cellphone", "123456");//用户名 82 params.put("password", "123456");//密码 83 OKhttpManager.postAsync("http://58.250.31.19:28080/afeducation/appfront/main/loginUser_app.do", params, new OKhttpManager.DataCallBack() { 84 @Override 85 public void requestFailure(Call call, IOException e) { 86 textView.setText(e.toString()); 87 } 88 89 @Override 90 public void requestSuccess(String result) { 91 textView.setText(result); 92 } 93 }); 94 break; 95 case R.id.btn_four://文件下载 调用方法 96 97 break; 98 } 99 } 100 }
activity_main.xml 布局文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:orientation="vertical" 7 android:paddingBottom="@dimen/activity_vertical_margin" 8 android:paddingLeft="@dimen/activity_horizontal_margin" 9 android:paddingRight="@dimen/activity_horizontal_margin" 10 android:paddingTop="@dimen/activity_vertical_margin" 11 tools:context="com.example.administrator.okhttp3.MainActivity"> 12 13 <Button 14 android:id="@+id/btn_one" 15 android:layout_width="wrap_content" 16 android:layout_height="wrap_content" 17 android:text="同步get" /> 18 19 <Button 20 android:id="@+id/btn_two" 21 android:layout_width="wrap_content" 22 android:layout_height="wrap_content" 23 android:text="异步get" /> 24 25 <Button 26 android:id="@+id/btn_three" 27 android:layout_width="wrap_content" 28 android:layout_height="wrap_content" 29 android:text="Post提交表单" /> 30 31 <Button 32 android:id="@+id/btn_four" 33 android:layout_width="wrap_content" 34 android:layout_height="wrap_content" 35 android:text="文件下载" /> 36 37 <TextView 38 android:id="@+id/tv" 39 android:layout_width="wrap_content" 40 android:layout_height="wrap_content" 41 android:text="text" /> 42 </LinearLayout>
以前都是用Volley去进行网络交互,时间久了,也想换换新的东西。网络请求框架各具特色,需要自己不断探索和选择。加油!