前言
本篇文章主要講解 Android 比較常用的網(wǎng)絡(luò)框架封裝,以及實(shí)現(xiàn)一句代碼隨意切換主流網(wǎng)絡(luò)框架琅拌。讀者也可根據(jù)該本章思路實(shí)現(xiàn)其他效果佛纫,比如說,隨意切換權(quán)限請(qǐng)求框架等萌焰。
特點(diǎn)
按這思路寫哺眯,代碼重構(gòu)非常簡單谷浅!
什么是隔離層設(shè)計(jì)扒俯?
先來個(gè)圖解釋下我們就拿現(xiàn)實(shí)生活舉例。
將買房的人(客戶)看成是我們寫的APP一疯;
將有房的人(業(yè)主)看成是我們接觸的主流網(wǎng)絡(luò)框架(XUtils撼玄、OkHttp、OkGo....);
將房地產(chǎn)公司(比如說鏈家)看成是客戶(我們app)所需要的服務(wù)(post墩邀、get網(wǎng)絡(luò)請(qǐng)求等)掌猛;
將業(yè)務(wù)員(中介)看成是客戶的推薦者;
那么
App想要實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求眉睹,就要先去找到房產(chǎn)公司的業(yè)務(wù)員荔茬,業(yè)務(wù)員就會(huì)在房產(chǎn)公司里拿到已經(jīng)入駐的網(wǎng)絡(luò)框架列表(業(yè)主列表),提供給用戶選擇竹海,用戶不滿意這個(gè)房子(網(wǎng)絡(luò)框架)慕蔚,就可以隨時(shí)換下一個(gè)。而房產(chǎn)公司以及業(yè)務(wù)員就是本章所謂的隔離層斋配。
思路理解清楚了孔飒,接下來就開始實(shí)戰(zhàn)操作了
第一步灌闺,我們先創(chuàng)建房產(chǎn)公司 IHttpProcessor
/**
* 房產(chǎn)公司
*/
public interface IHttpProcessor {
//有賣房的能力
//網(wǎng)絡(luò)訪問的能力
void post(String url, Map<String,Object> params, ICallback callback);
void get(String url, Map<String,Object> params,ICallback callback);
}
交易是否成功的回調(diào) ICallback
/**
* 頂層的回調(diào)接口
*/
public interface ICallback {
void onSuccess(String result);
void onFailure(String e);
}
以及 ICallback 擴(kuò)展,HttpCallback
/**
* 回調(diào)接口的一種實(shí)現(xiàn)
*/
public abstract class HttpCallback<Result> implements ICallback{
@Override
public void onSuccess(String result) {
//網(wǎng)絡(luò)上回來的結(jié)果都 在result上
//1.得到調(diào)用者用什么樣的javaBean來接收數(shù)據(jù)
Class<?> clz=analysisClassInfo(this);
//2.把String轉(zhuǎn)成javaBean對(duì)象交給用戶
Gson gson=new Gson();
Result objResult=(Result)gson.fromJson(result,clz);
//3.把結(jié)果交給用戶
onSuccess(objResult);
}
public abstract void onSuccess(Result objResult);
/**
* 通過該功能得到輸入?yún)?shù)的實(shí)際類型
*/
private Class<?> analysisClassInfo(Object object){
//getGenericSuperclass()返回一個(gè)類型 對(duì)象
//這個(gè)對(duì)象可以得到包含原始類型坏瞄,參數(shù)化桂对,數(shù)組,類型變量鸠匀,基本數(shù)據(jù)類型
Type getType=object.getClass().getGenericSuperclass();
Type[] params=((ParameterizedType)getType).getActualTypeArguments();
return (Class<?>)params[0];
}
@Override
public void onFailure(String e) {
}
}
代碼分析:為什么要?jiǎng)?chuàng)建該類蕉斜?想象一下,當(dāng)用戶狮崩,買房成功時(shí)蛛勉,客戶是不是要有合同,以及各種憑證睦柴。而該類就是對(duì)網(wǎng)絡(luò)請(qǐng)求成功后的數(shù)據(jù)做了一層數(shù)據(jù)解析诽凌,盡量把復(fù)雜的數(shù)據(jù)處理好,給上一層遞交一個(gè)非常簡易的數(shù)據(jù)結(jié)構(gòu)坦敌。
第二步侣诵,我們創(chuàng)建業(yè)主,并入駐房產(chǎn)公司(OkHttp舉例)
public class OkHttpProcessor implements IHttpProcessor {
private OkHttpClient mOkHttpClient;
private Handler myHandler;
public OkHttpProcessor(){
mOkHttpClient=new OkHttpClient();
myHandler=new Handler(Looper.getMainLooper());
}
@Override
public void post(String url, Map<String, Object> params,final ICallback callback) {
final RequestBody requestBody=appendBody(params);
Request request=new Request.Builder()
.url(url)
.post(requestBody)
.build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
final String result=response.body().string();
if(response.isSuccessful()){
myHandler.post(new Runnable() {
@Override
public void run() {
callback.onSuccess(result);
}
});
}else{
myHandler.post(new Runnable() {
@Override
public void run() {
callback.onFailure(result);
}
});
}
}
@Override
public void onFailure(Call call, IOException e) {
myHandler.post(new Runnable() {
@Override
public void run() {
callback.onFailure("onFailure");
}
});
}
});
}
@Override
public void get(String url, Map<String, Object> params, ICallback callback) {
}
private RequestBody appendBody(Map<String, Object> params){
FormBody.Builder body=new FormBody.Builder();
if(params==null || params.isEmpty()){
return body.build();
}
for(Map.Entry<String, Object> entry:params.entrySet()){
body.add(entry.getKey(),entry.getValue().toString());
}
return body.build();
}
}
代碼分析:該類 OkHttpProcessor 實(shí)現(xiàn)了房產(chǎn)公司這個(gè)接口狱窘,并在對(duì)應(yīng)房產(chǎn)公司服務(wù)(post杜顺,get)里面實(shí)現(xiàn)了 對(duì)應(yīng)網(wǎng)絡(luò)請(qǐng)求的服務(wù),讓房產(chǎn)公司擁有處理 OkHttpProcessor 對(duì)應(yīng)post蘸炸,get 的能力躬络。
第三步,我們?cè)俅蝿?chuàng)建一個(gè)業(yè)主搭儒,并入駐房產(chǎn)公司(XUtils舉例)
public class XUtilsProcessor implements IHttpProcessor {
public XUtilsProcessor(MyApplication app){
x.Ext.init(app);
}
@Override
public void post(String url, Map<String, Object> params,final ICallback callback) {
RequestParams requestParams=new RequestParams(url);
x.http().post(requestParams, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
callback.onSuccess(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
@Override
public void get(String url, Map<String, Object> params, ICallback callback) {
}
}
到這穷当,房產(chǎn)公司有了,業(yè)主也有了多個(gè)淹禾,并且也入駐了房產(chǎn)公司馁菜。那么現(xiàn)在該業(yè)務(wù)員(中介)出場(chǎng)了
第四步,中介出場(chǎng) HttpHelper
public class HttpHelper implements IHttpProcessor {
//定義一個(gè)業(yè)主铃岔,賣房的人
private static IHttpProcessor mIHttpProcessor=null;
//通過一個(gè)API來設(shè)置哪一個(gè)業(yè)主賣出自己的房子汪疮,(誰來完成網(wǎng)絡(luò)訪問)
public static void init(IHttpProcessor httpProcessor){
mIHttpProcessor=httpProcessor;
}
//單例
private static HttpHelper instance;
public static HttpHelper obtain(){
synchronized (HttpHelper.class){
if(instance==null){
instance=new HttpHelper();
}
}
return instance;
}
private HttpHelper(){}
/**
* 能不能自己賣出房
*/
@Override
public void post(String url, Map<String, Object> params, ICallback callback) {
//http://www.aaa.bbb/index?&user=jett&pwd=123
//http://www.aaa.bbb/index
//&user=jett&pwd=123
String finalUrl=appendParams(url,params);
mIHttpProcessor.post(url,params,callback);
}
@Override
public void get(String url, Map<String, Object> params, ICallback callback) {
}
public static String appendParams(String url, Map<String,Object> params) {
if(params==null || params.isEmpty()){
return url;
}
StringBuilder urlBuilder=new StringBuilder(url);
if(urlBuilder.indexOf("?")<=0){
urlBuilder.append("?");
}else{
if(!urlBuilder.toString().endsWith("?")){
urlBuilder.append("&");
}
}
for(Map.Entry<String,Object> entry:params.entrySet()){
urlBuilder.append("&"+entry.getKey())
.append("=")
.append(encode(entry.getValue().toString()));
}
return urlBuilder.toString();
}
private static String encode(String str){
try {
return URLEncoder.encode(str,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}
代碼分析:該類 HttpHelper 就是我們所說的賣房中介,在這里面先實(shí)現(xiàn)房產(chǎn)公司賣房的能力毁习,也對(duì)客戶(APP)提供了到底要賣哪一套房子(哪個(gè)網(wǎng)絡(luò)框架)的 init 方法 智嚷。靜態(tài)變量 mIHttpProcessor 就是即將要賣房的業(yè)主,也就是我們即將要用的網(wǎng)絡(luò)框架纺且。
到這盏道,所有的準(zhǔn)備工作都做好了,現(xiàn)在可以開始交易了
第五步隆檀,開始交易
- MyApplication
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// HttpHelper.init(new VolleyProcessor(this));
// HttpHelper.init(new XUtilsProcessor(this)); 確定使用那一套網(wǎng)絡(luò)框架
HttpHelper.init(new OkHttpProcessor());
}
}
- MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View view) {
String url="https://v.juhe.cn/historyWeather/citys";
HashMap<String,Object> params=new HashMap<>();
//https://v.juhe.cn/historyWeather/citys?&province_id=2&key=bb52107206585ab074f5e59a8c73875b
params.put("province_id","2");
params.put("key","bb52107206585ab074f5e59a8c73875b");
HttpHelper.obtain().post(url, params, new HttpCallback<ResponceData>() {
@Override
public void onSuccess(ResponceData objResult) {
Toast.makeText(MainActivity.this, objResult.getResultcode(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(String e) {
super.onFailure(e);
}
});
}
}
代碼分析:想必這倆類摇天,不用過多解釋了吧粹湃,HttpCallback 這個(gè)就是剛剛我們所創(chuàng)建的 CallBack擴(kuò)展類,那個(gè)ResponceData 就是網(wǎng)絡(luò)請(qǐng)求成功 對(duì)應(yīng)json實(shí)體對(duì)象
Demo地址:點(diǎn)我下載
Android相關(guān)視頻教程推薦
【2021 最新版】Android studio全套教程+Android(安卓)開發(fā)入門到精通(項(xiàng)目實(shí)戰(zhàn)篇)_嗶哩嗶哩_bilibili
Android開發(fā)進(jìn)階學(xué)習(xí)—設(shè)計(jì)思想解讀開源框架 · 已更新至104集(持續(xù)更新中~)_嗶哩嗶哩_bilibili
【實(shí)戰(zhàn)教學(xué)】Android開發(fā)—jetpack入門到精通_嗶哩嗶哩_bilibili
Android音視頻開發(fā):音視頻基礎(chǔ)知識(shí)到直播推流實(shí)戰(zhàn)系列教程_嗶哩嗶哩_bilibili
Android項(xiàng)目實(shí)戰(zhàn)-從0開始手把手實(shí)現(xiàn)組件化路由SDK項(xiàng)目實(shí)戰(zhàn)_嗶哩嗶哩_bilibili
本文轉(zhuǎn)自 https://juejin.cn/post/6983323372734119972泉坐,如有侵權(quán)为鳄,請(qǐng)聯(lián)系刪除。