日誌攔截器 +OKHTTP二次封裝
阿新 • • 發佈:2018-11-24
日誌攔截器類,
請求來了,先在這裡進行處理,可以得到發請求到得到請求消耗多久的時間
- 作用:可以排查網路請求速度慢的根本原因
- 1.有可能是我們在請求網路時,客戶端寫了一堆業務邏輯
- 2.有可能是伺服器端,寫的有問題
- 3.有可能就是網速不給力
-
OKHTTP二次封裝,
- 1.因為okhttp程式碼太多,太冗餘,使用的時候不是太方便,兩行程式碼搞定 -----doGet,doPost
- 2.都要建立OKhttp和咱們的handler物件,物件建立太多,導致記憶體過多的消耗 ----單例
- 3.非同步請求okhttp,資料請求成功以後,資料在子執行緒,所以我們還要寫handler,把資料放到主執行緒去,邏輯複雜 -----handler和介面
-
- okhttp,handler,單例模式,介面
搭建環境:
首先我們配置一下網路許可權和依賴
依賴
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
許可權
<uses-permission android:name="android.permission.INTERNET"/>
MainActivity:
package com.example.log; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import java.util.HashMap; public class MainActivity extends AppCompatActivity { private String Path = "http://publicobject.com/helloworld.txt"; private TextView text_tv; String url = "http://www.zhaoapi.cn/product/getCarts"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { text_tv = (TextView) findViewById(R.id.text_tv); } public void okhttp_text(View view) { OkhtttpUtilsTwo.getInstance().doGet(Path, new OkhtttpUtilsTwo.OkCallback() { @Override public void onFailure(Exception e) { } @Override public void onResponse(String json) { text_tv.setText(json); } }); } public void okhttp_ok(View view){ HashMap<String, String> map = new HashMap<>(); map.put("uid","71"); //測試我的okhttp工具類是否有問題 OkhtttpUtilsTwo.getInstance().doPost(url, map, new OkhtttpUtilsTwo.OkCallback() { @Override public void onFailure(Exception e) {} @Override public void onResponse(String json) { text_tv.setText(json); } }); } }
二次封裝OkHttp請求
package com.example.log; import android.os.Handler; import android.os.Looper; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class OkhtttpUtilsTwo { ////////////////////////////////////////////////單例////////////////////////////////////// private final Handler mHandler; private final OkHttpClient mOkHttpClient; private static OkhtttpUtilsTwo sOkhtttpUtilsTwo; //構造方法不私有 private OkhtttpUtilsTwo(){ //如果建立Handler的物件,是在一個普通的類裡建立,那麼一定要加上Looper.getMainLooper()這個引數 mHandler = new Handler(Looper.getMainLooper()); LoggingInterceptor loggingInterceptor = new LoggingInterceptor(); mOkHttpClient = new OkHttpClient.Builder() //日誌攔截器 .addInterceptor(loggingInterceptor) .readTimeout(5000, TimeUnit.MILLISECONDS) .connectTimeout(5000, TimeUnit.MILLISECONDS) .writeTimeout(5000, TimeUnit.MILLISECONDS) .build(); } //單例暴露一個普通的方法,給對方,雙重鎖模式 public static OkhtttpUtilsTwo getInstance(){ if (sOkhtttpUtilsTwo ==null){ synchronized (OkhtttpUtilsTwo.class){ if (sOkhtttpUtilsTwo == null){ return sOkhtttpUtilsTwo =new OkhtttpUtilsTwo(); } } } return sOkhtttpUtilsTwo; } //////////////////////////////////////////////////////介面//////////////////////////////// public interface OkCallback { void onFailure(Exception e); void onResponse(String json); } ////////////////////////////////////////////okhttp與handler/////////////////////////// /////封裝doGEt的網路封裝,引數定義兩個,一個是URL網址 一個實現介面的物件 public void doGet(String url , final OkCallback okCallback){ Request request = new Request.Builder() .get() .url(url) .build(); Call call = mOkHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { if (okCallback !=null){ //切換到主執行緒 mHandler.post(new Runnable() { @Override public void run() { okCallback.onFailure(e); } }); } } @Override public void onResponse(Call call, Response response) throws IOException { if(response !=null && response.isSuccessful()){ final String json = response.body().string(); if (okCallback !=null){ //切換到主執行緒 mHandler.post(new Runnable() { @Override public void run() { okCallback.onResponse(json); } }); } } } }); } //封裝doPost的邏輯程式碼 public void doPost(String url, Map<String,String> map, final OkCallback okCallback){ //建立FormBody物件,把表單新增到FormBody FormBody.Builder builder = new FormBody.Builder(); //集合物件不為null的情況下 if (map != null){ for(String key: map.keySet()){ builder.add(key,map.get(key)); } } FormBody formBody = builder.build(); //建立Request物件 Request request = new Request.Builder() .post(formBody) .url(url) .build(); Call call = mOkHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { if (okCallback !=null){ //切換到主執行緒 mHandler.post(new Runnable() { @Override public void run() { okCallback.onFailure(e); } }); } } @Override public void onResponse(Call call, Response response) throws IOException { if(response !=null && response.isSuccessful()){ final String json = response.body().string(); if (okCallback !=null){ //切換到主執行緒 mHandler.post(new Runnable() { @Override public void run() { okCallback.onResponse(json); } }); } } } }); } }
自定義日誌攔截器工具類:
package com.example.log;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
//拿到Request物件
Request request = chain.request();
long t1 = System.nanoTime();
System.out.println(" request = " + String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
//拿到Response物件
Response response = chain.proceed(request);
long t2 = System.nanoTime();
//得出請求網路,到得到結果,中間消耗了多長時間
System.out.println("response " + String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
關於日誌攔截器就跟大家聊到這裡,希望能給大家帶來幫助