Android進階系列-手寫高併發網路訪問框架
一個專案,訪問網路那是必須的。現在開源的網路框架很多。比如最開始的HeepClient,Volley,xUtils,最近很火的okhttp,還有例如retrofit,okGo這些都是很不錯 的框架。但是畢竟是別人寫的。出了什麼問題都不好查詢。這裡自己封裝了一個網路框架,記錄一下封裝思路。
採用執行緒池做網路請求的緩衝,可以做到高併發。同時將網路請求和網路處理分開,這樣邏輯更清楚。這裡的模式參考了Volley。
同時封裝了網路斷點下載檔案的功能,添加了優先順序,採用資料庫做檔案下載記錄。做優先順序的判定。
由於時間有限,寫這個框架花了點時間,現在寫這個介紹文件有點著急了。具體的邏輯在原始碼中都有的,參照了各個大神的程式碼,有鴻洋的okhttpUtils還有okGo這些寫的很好的三方。想要學習,就檢視下面git的原始碼。
使用時匯入grandle:compile 'com.singleshu88:OkHttpLemon:+'
具體API .init() OkHttpLemon的初始化。
.initOptions() 初始化全域性變數,也就是設定響應時間之類的引數。
.url(String url) 設定url不論是下載檔案,上傳,還是get,post都是在這裡設定url
.get(Class responseClazz) 使用get請求獲取引數,同時設定響應型別。
.get() 使用get,預設返回String型別
.postString(String key,String value) 使用post上傳引數,可以多次呼叫。
.postFile(String name,String fileName,File imgFile) 使用post上傳檔案,圖片之類。
.postResponseClazz(Class responseClazz) 使用post請求,設定響應型別
.executes(@NonNull IDataListener dataListener) 執行網路請求,返回String型別
.execute(@NonNull IDataListener dataListener) 執行網路請求,返回設定型別
這些都是常用的網路請求方式,還單獨封裝了檔案下載。
.downPriority(HttpPriority priority) 設定下載檔案的優先順序,一個列舉型別,分別有low,middle,high
.downFilePath(String filePath) 下載檔案儲存的地址,sdcard/0/wps.apk 包括全名
.pause(String url) 通過下載地址來暫停下載進度
.pause(String url,String fileName) 通過下載地址和儲存檔案地址來暫停下載進度
.start(String url) 通過下載地址來重啟一個檔案下載
.start(String url,String filePath) 通過下載地址和檔案儲存地址來準確的重啟一個被暫停的檔案下載
.getOptions() 設定網路連結超時等引數
.executeDown(@NonNull IDownloadCallback dataCallback) 執行檔案下載
具體使用
/** * Created by ShuWen on 2017/3/11. */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); OkHttpLemon.init().initOptions(); } }
package com.example.administrator.okhttplemondemo; import android.os.Environment; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import com.example.lemonlibrary.db.util.PermissionUtils; import com.example.lemonokhttp.enums.DownloadStatus; import com.example.lemonokhttp.http.OkHttpLemon; import com.example.lemonokhttp.interfaces.IDataListener; import com.example.lemonokhttp.interfaces.IDownloadCallback; public class MainActivity extends AppCompatActivity { public String tabaoUrl = "http://download.apk8.com/soft/2015/%E6%B7%98%E5%AE%9D.apk"; public String wpsUrl = "http://gdown.baidu.com/data/wisegame/8be18d2c0dc8a9c9/WPSOffice_177.apk"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); PermissionUtils.getInstance().requestPermission(this); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); PermissionUtils.getInstance().onRequestPermissionsResult(requestCode,permissions,grantResults,this); } public void click(View view){ switch (view.getId()){ case R.id.btn1: Log.i("tag00","下載wps:"); OkHttpLemon.init() .url(wpsUrl) .downFilePath(Environment.getExternalStorageDirectory() + "/wps.apk") .executeDown(new IDownloadCallback() { @Override public void onDownTotalLength(long totalLen) { } @Override public void onDownCurrentLenChange(long alreadyDownLen, double downPercent, long speed) { Log.i("tag00","-----已下載 "+ alreadyDownLen/1024/1024+"M 下載長度 "+downPercent*100 +"% "+"下載速度:"+ speed/1000 +"k/s"); } @Override public void onFinish(long alreadyDownLen, long totalLen, String stratTime, String finishTime) { Log.i("tag00","下載成功。" + stratTime + " "+finishTime); } @Override public void onEorror(int errorCode, String ts) { Log.i("tag00","下載異常:"+" errorCode: " + errorCode +" errorMsg " +ts); } @Override public void onDownStatusChange(DownloadStatus downStatus) { Log.i("tag00","狀態變更:"+downStatus); } }); break; case R.id.btn2: //預設下載檔案地址 sdcard/okLemonDown/downFiles Log.i("tag00","下載game:"); OkHttpLemon.init() .url(tabaoUrl) .executeDown(new IDownloadCallback() { @Override public void onDownTotalLength(long totalLen) { } @Override public void onDownCurrentLenChange(long alreadyDownLen, double downPercent, long speed) { Log.i("tag00","-----已下載 "+ alreadyDownLen/1024/1024+"M 下載長度 "+downPercent*100 +"% "+"下載速度:"+ speed/1000 +"k/s"); } @Override public void onFinish(long alreadyDownLen, long totalLen, String stratTime, String finishTime) { Log.i("tag00","下載成功。"); } @Override public void onEorror(int errorCode, String ts) { Log.i("tag00","下載異常:"+" errorCode: " + errorCode +" errorMsg " +ts); } @Override public void onDownStatusChange(DownloadStatus downStatus) { Log.i("tag00","狀態變更:"+downStatus); } }); break; case R.id.btn3: OkHttpLemon.init().pause(wpsUrl); break; case R.id.btn5: OkHttpLemon.init().start(wpsUrl); break; case R.id.btn4: OkHttpLemon.init().pause(tabaoUrl); break; case R.id.btn6: OkHttpLemon.init().start(tabaoUrl); break; case R.id.btn7: OkHttpLemon.init().url("http://v3.wufazhuce.com:8000/api/hp/idlist/0") .get(MainPageBean.class) .execute(new IDataListener<MainPageBean>() { @Override public void onSuccess(MainPageBean s) { Log.i("tag00",s.getRes()+""); for (String s1:s.getData()) { Log.i("tag00",s1); } } @Override public void onError(int code,String ts) { } }); break; case R.id.btn8: OkHttpLemon.init().url("http://v3.wufazhuce.com:8000/api/praise/add") .postString("itemid","1644") .postString("type","hpcontent") .postString("deviceid","ffffffff-b821-e83f-45c3-423b5c7ea996") .postString("version","3.5.0") .postString("devicetype","android") .postString("platform","android") .executes(new IDataListener<String>() { @Override public void onSuccess(String s) { Log.i("tag00",s); } @Override public void onError(int code, String ts) { Log.i("tag00","code:"+code + "提示:"+ts); } }); break; } } }
package com.example.administrator.okhttplemondemo; import java.util.List; /** * Created by ShuWen on 2016/10/26. */ public class MainPageBean { /** * res : 0 * data : ["1509","1505","1506","1504","1497","1503","1498","1502","1501","1500"] */ private int res; private List<String> data; public int getRes() { return res; } public void setRes(int res) { this.res = res; } public List<String> getData() { return data; } public void setData(List<String> data) { this.data = data; } @Override public String toString() { return "MainPageBean{" + "res=" + res + ", data=" + data + '}'; } }
這個網路載入框架的檔案下載的設計還是可以提供參考的,使用了我之前設計的LemonDao的資料庫框架擴充套件性很強。
具體使用參照:https://github.com/SingleShu/OkHttpLemonDemo
--------------------- 作者:SingleShu888 來源:CSDN 原文:https://blog.csdn.net/sw5131899/article/details/61429679 版權宣告:本文為博主原創文章,轉載請附上博文連結!