OKhttpManager2.Class 請求工具類java
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 = null; 87 if (entry.getValue() == null) { 88 value = ""; 89 } else { 90 value = 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 @Override 103 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 @Override 120 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 @Override 131 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 工具類的調用方法android
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 @Override 21 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 @Override 36 public void onClick(View view) { 37 switch (view.getId()) { 38 case R.id.btn_one://同步GET 39 new Thread(new Runnable() { 40 @Override 41 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 @Override 50 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://異步GET 61 OkhttpManager2.getAsync("http://web.juhe.cn:8080/finance/exchange/rmbquot", new OkhttpManager2.DataCallBack() { 62 @Override 63 public void requestFailure(Request request, IOException e) { 64 //數據加載成功會執行此方法,此時能夠直接更新UI 65 textView.setText(e.toString()); 66 } 67 68 @Override 69 public void requestSuccess(String result) { 70 //數據加載成功會執行此方法,此時能夠直接更新UI 71 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 @Override 81 public void requestFailure(Request request, IOException e) { 82 //數據加載成功會執行此方法,此時能夠直接更新UI 83 textView.setText(e.toString()); 84 } 85 86 @Override 87 public void requestSuccess(String result) { 88 //數據加載成功會執行此方法,此時能夠直接更新UI 89 textView.setText(result); 90 } 91 }); 92 break; 93 case R.id.btn_four://文件下載 94 95 break; 96 } 97 } 98 }
activity_main.xml 佈局文件web
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>
我的以爲主要得注意的地方是,任何更新UI操做,都必需要在主線程中才能更新,而網絡請求操做,則須要放在子線程。這裏經過接口回調和數據分發的方式,利用Handler發送到主線程,實現UI的更新。json