首页 > 代码库 > OKhttp的封装(下)
OKhttp的封装(下)
OKhttpManager2.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 * 当前类: OKhttp 工具封装类 20 * <p/> 21 * Created by ${火龙裸先生} on 2016/9/30. 22 * 邮箱:791335000@qq.com 23 */ 24 public class OkhttpManager2 { 25 26 private OkHttpClient client; 27 private static OkhttpManager2 okhttpManager2; 28 private Handler mHandler; 29 30 /** 31 * 单例模式 OKhttpManager2实例 32 */ 33 private static OkhttpManager2 getInstance() { 34 if (okhttpManager2 == null) { 35 okhttpManager2 = new OkhttpManager2(); 36 } 37 return okhttpManager2; 38 } 39 40 private OkhttpManager2() { 41 client = new OkHttpClient(); 42 mHandler = new Handler(Looper.getMainLooper()); 43 } 44 45 46 //****************** 内部逻辑处理方法 ******************/ 47 private Response p_getSync(String url) throws IOException { 48 Request request = new Request.Builder().url(url).build(); 49 Response response = client.newCall(request).execute(); 50 return response; 51 } 52 53 private String p_getSyncAsString(String url) throws IOException { 54 return p_getSync(url).body().string(); 55 } 56 57 private void p_getAsync(String url, final DataCallBack callBack) { 58 final Request request = new Request.Builder().url(url).build(); 59 client.newCall(request).enqueue(new Callback() { 60 @Override 61 public void onFailure(Call call, IOException e) { 62 deliverDataFailure(request, e, callBack); 63 } 64 65 @Override 66 public void onResponse(Call call, Response response) { 67 try { 68 String result = response.body().string(); 69 deliverDataSuccess(result, callBack); 70 } catch (IOException e) { 71 e.printStackTrace(); 72 deliverDataFailure(request, 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 if (params == null) { 81 params = new HashMap<String, String>(); 82 } 83 FormBody.Builder builder = new FormBody.Builder(); 84 for (Map.Entry<String, String> entry : params.entrySet()) { 85 String key = entry.getKey().toString(); 86 String value = http://www.mamicode.com/null; 87 if (entry.getValue() == null) { 88 valuehttp://www.mamicode.com/= ""; 89 } else { 90 value =http://www.mamicode.com/ entry.getValue().toString(); 91 } 92 builder.add(key, value); 93 } 94 requestBody = builder.build(); 95 final Request request = new Request.Builder().url(url).post(requestBody).build(); 96 client.newCall(request).enqueue(new Callback() { 97 @Override 98 public void onFailure(Call call, IOException e) { 99 deliverDataFailure(request, e, callBack);100 }101 102 @Override103 public void onResponse(Call call, Response response) throws IOException {104 try {105 String result = response.body().string();106 deliverDataSuccess(result, callBack);107 } catch (IOException e) {108 e.printStackTrace();109 deliverDataFailure(request, e, callBack);110 }111 }112 });113 }114 115 116 //****************** 数据分发的方法 ******************/117 private void deliverDataFailure(final Request request, final IOException e, final DataCallBack callBack) {118 mHandler.post(new Runnable() {//发送到主线程119 @Override120 public void run() {121 if (callBack != null) {122 callBack.requestFailure(request, e);123 }124 }125 });126 }127 128 private void deliverDataSuccess(final String result, final DataCallBack callBack) {129 mHandler.post(new Runnable() {//同样 发送到主线程130 @Override131 public void run() {132 if (callBack != null) {133 callBack.requestSuccess(result);134 }135 }136 });137 }138 139 140 //****************** 对外公布的方法 ******************/141 public static Response getSync(String url) throws IOException {142 return getInstance().p_getSync(url);//同步GET,返回Response类型数据143 }144 145 public static String getSyncAsString(String url) throws IOException {146 return getInstance().p_getSyncAsString(url);//同步GET,返回String类型数据(和上面getSync方法只是返回的数据类型不同而已)147 }148 149 public static void getAsync(String url, DataCallBack callBack) {150 getInstance().p_getAsync(url, callBack);//异步GET 调用方法151 }152 153 public static void postAsync(String url, Map<String, String> params, DataCallBack callBack) {154 getInstance().p_postAsync(url, params, callBack);//POST提交表单 调用方法155 }156 157 158 //****************** 数据回调接口 ******************/159 public interface DataCallBack {160 void requestFailure(Request request, IOException e);161 162 void requestSuccess(String result);163 }164 }
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.Request;14 15 public class MainActivity extends AppCompatActivity implements View.OnClickListener {16 17 private Button button1, button2, button3, button4;18 private TextView textView;19 20 @Override21 protected void onCreate(Bundle savedInstanceState) {22 super.onCreate(savedInstanceState);23 setContentView(R.layout.activity_main);24 button1 = (Button) findViewById(R.id.btn_one);25 button2 = (Button) findViewById(R.id.btn_two);26 button3 = (Button) findViewById(R.id.btn_three);27 button4 = (Button) findViewById(R.id.btn_four);28 button1.setOnClickListener(this);29 button2.setOnClickListener(this);30 button3.setOnClickListener(this);31 button4.setOnClickListener(this);32 textView = (TextView) findViewById(R.id.tv);33 }34 35 @Override36 public void onClick(View view) {37 switch (view.getId()) {38 case R.id.btn_one://同步GET39 new Thread(new Runnable() {40 @Override41 public void run() {42 try {43 // 调用getSync方法(以下两行),和调用getSyncAsString方法相同,只是返回数据类型不一样44 // Response response = OkhttpManager2.getSync("http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=jsonp9");45 // final String message = response.body().string();46 // 调用getSyncAsString方法(以下一行)47 final String message = OkhttpManager2.getSyncAsString("http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=jsonp9");48 runOnUiThread(new Runnable() {49 @Override50 public void run() {51 textView.setText(message);52 }53 });54 } catch (IOException e) {55 e.printStackTrace();56 }57 }58 }).start();59 break;60 case R.id.btn_two://异步GET61 OkhttpManager2.getAsync("http://web.juhe.cn:8080/finance/exchange/rmbquot", new OkhttpManager2.DataCallBack() {62 @Override63 public void requestFailure(Request request, IOException e) {64 //数据加载成功会执行此方法,此时可以直接更新UI65 textView.setText(e.toString());66 }67 68 @Override69 public void requestSuccess(String result) {70 //数据加载成功会执行此方法,此时可以直接更新UI71 textView.setText(result);72 }73 });74 break;75 case R.id.btn_three://POST提交表单76 Map<String, String> params = new HashMap<String, String>();77 params.put("cellphone", "123456");//用户名78 params.put("password", "123456");//密码79 OkhttpManager2.postAsync("http://58.250.31.19:28080/afeducation/appfront/main/loginUser_app.do", params, new OkhttpManager2.DataCallBack() {80 @Override81 public void requestFailure(Request request, IOException e) {82 //数据加载成功会执行此方法,此时可以直接更新UI83 textView.setText(e.toString());84 }85 86 @Override87 public void requestSuccess(String result) {88 //数据加载成功会执行此方法,此时可以直接更新UI89 textView.setText(result);90 }91 });92 break;93 case R.id.btn_four://文件下载94 95 break;96 }97 }98 }
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 <Button14 android:id="@+id/btn_one"15 android:layout_width="wrap_content"16 android:layout_height="wrap_content"17 android:text="同步get" />18 19 <Button20 android:id="@+id/btn_two"21 android:layout_width="wrap_content"22 android:layout_height="wrap_content"23 android:text="异步get" />24 25 <Button26 android:id="@+id/btn_three"27 android:layout_width="wrap_content"28 android:layout_height="wrap_content"29 android:text="Post提交表单" />30 31 <Button32 android:id="@+id/btn_four"33 android:layout_width="wrap_content"34 android:layout_height="wrap_content"35 android:text="文件下载" />36 37 <TextView38 android:id="@+id/tv"39 android:layout_width="wrap_content"40 android:layout_height="wrap_content"41 android:text="text" />42 </LinearLayout>
个人觉得主要得注意的地方是,任何更新UI操作,都必须要在主线程中才能更新,而网络请求操作,则需要放在子线程。这里通过接口回调和数据分发的方式,利用Handler发送到主线程,实现UI的更新。
OKhttp的封装(下)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。