android Retrofit2網(wǎng)絡(luò)請(qǐng)求封裝介紹
1. Retrofit使用
Retrofit是一個(gè)現(xiàn)在網(wǎng)絡(luò)請(qǐng)求框架,先來(lái)說(shuō)一下怎么使用
網(wǎng)絡(luò)權(quán)限(添加到AndroidManifest.xml)
<uses-permission android:name="android.permission.INTERNET" />
gradle依賴(添加到build.gradle)
implementation("com.squareup.okhttp3:okhttp:4.9.2")
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
定義接口,網(wǎng)絡(luò)請(qǐng)求的方法
public interface Request {
@GET("/xx/xx")
Call<ResponseBody> get();
}
實(shí)例化Retrofit
Retrofit retrofit = new Retrofit.Builder().baseUrl("BASE_URL").build();
通過(guò)Retrofit實(shí)例創(chuàng)建接口服務(wù)對(duì)象
Request request = retrofit.create(Request.class);
調(diào)用接口中的方法
Call<ResponseBody> call = request.get();
執(zhí)行異步請(qǐng)求(同步請(qǐng)求需要?jiǎng)?chuàng)建一個(gè)新的線程去執(zhí)行)
call.enqueue(new retrofit2.Callback<ResponseBody>() {
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
}
});
2. Retrofit封裝
以上可以看出Retrofit是個(gè)好東西,可是用起來(lái)是比較麻煩的,所有在實(shí)際使用中對(duì)Retrofit進(jìn)行一下小小的封裝是很有必要的。
定義接口(所有的請(qǐng)求參數(shù)都是以map的形式)
public interface Request {
/**
* 不帶參數(shù)的get請(qǐng)求
* @param url
* @return
*/
@GET()
Call<ResponseBody> get(@Url String url);
/**
* 帶參數(shù)的get請(qǐng)求
* @param url
* @param map 參數(shù)默認(rèn)是map
* @return
*/
@GET()
Call<ResponseBody> get(@Url String url, @QueryMap Map<String,String> map);
/**
* 不帶參數(shù)的post請(qǐng)求
* @param url
* @return
*/
@POST()
Call<ResponseBody> post(@Url String url);
/**
* 帶參數(shù)的post請(qǐng)求
* @param url
* @param map
* @return
*/
@POST()
@FormUrlEncoded
Call<ResponseBody> post(@Url String url, @FieldMap Map<String,String> map);
}
定義RetrofitManager,以單例模式獲取Retrofit實(shí)例
public enum RetrofitManager {
/**
* RetrofitManager的實(shí)例
*/
INSTANCE;
/**
*
* 后端接口的baseUrl,且只考慮一個(gè)url的情況(ip+端口,或者域名)
*/
private static final String BASE_URL = " Your BASE_URL";
private Retrofit retrofit;
/**
* 返回Retrofit實(shí)例,不添加轉(zhuǎn)換器
* @return
*/
public Retrofit getRetrofit(){
if(retrofit == null){
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.build();
}
return retrofit;
}
}
自定義的RetrofitCallback,在發(fā)送請(qǐng)求時(shí),通過(guò)匿名對(duì)象作為參數(shù)獲取后端的響應(yīng)結(jié)果。
public abstract class RetrofitCallback {
/**
* 開始執(zhí)行的方法
*/
public void onStart(){
//開啟loading
}
/**
* 結(jié)束執(zhí)行的方法
*/
public void onCompleted(){
//關(guān)閉loading
}
/**
* 執(zhí)行成功
* @param resultJsonString 返回的json字符串
*/
public abstract void onSuccess(String resultJsonString);
/**
* 失敗
* @param t 異常
*/
public abstract void onError(Throwable t);
/**
* 提示:服務(wù)異常
*/
public void serverErrMsg(){
//xxx
}
/**
* 提示:請(qǐng)求失敗
*/
public void reqErrMsg(){
//xxx
}
/**
* 提示:成功
*/
public void okMsg(){
//xxx
}
}
定義RetrofitUtil,封裝get和post方法。將RetrofitCallback作為請(qǐng)求參數(shù),在發(fā)送請(qǐng)求時(shí)重寫onSuccess和onError方法,執(zhí)行具體的操作。
public class RetrofitUtil {
private Retrofit(){}
/**
* 無(wú)參的get請(qǐng)求
* @param url
* @param callback
*/
public static void get(String url, RetrofitCallback callback){
sendRequest(getRequest().get(url),callback);
}
/**
* 有參的get請(qǐng)求
* @param url 請(qǐng)求的url
* @param map 參數(shù)
* @param callback 請(qǐng)求結(jié)束的回調(diào)
*/
public static void get(String url, Map<String,String> map, RetrofitCallback callback){
sendRequest(getRequest().get(url,map),callback);
}
/**
* 無(wú)參的post請(qǐng)求
* @param url
* @param callback
*/
public static void post(String url, RetrofitCallback callback){
sendRequest(getRequest().post(url), callback);
}
/**
* 有參的post請(qǐng)求
* @param url
* @param map
* @param callback
*/
public static void post(String url, Map<String,String> map, RetrofitCallback callback){
sendRequest(getRequest().post(url,map), callback);
}
/**
* 獲取Request實(shí)例
* @return
*/
private static Request getRequest(){
Retrofit retrofit = RetrofitManager.INSTANCE.getRetrofit();
return retrofit.create(Request.class);
}
/**
* 發(fā)送請(qǐng)求的共通方法,并對(duì)響應(yīng)結(jié)果進(jìn)行處理
* @param call
* @param callback 自定義的Callback
*/
private void sendRequest(Call<ResponseBody> call,RetrofitCallback callback){
//開啟loading
callback.onStart();
//異步請(qǐng)求
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//關(guān)閉loading
callback.onCompleted();
if(response.isSuccessful()){
//執(zhí)行RetrofitCallback的onSuccess方法,獲取響應(yīng)結(jié)果的json字符串
try {
String result = response.body().string();
callback.onSuccess(result);
//響應(yīng)成功
if(StringUtils.equals(result, Constant.SUCCESS)){
callback.okMsg();
}
} catch (IOException e) {
e.printStackTrace();
}
}else{
//服務(wù)異常
callback.serverErrMsg();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
callback.onCompleted();
//請(qǐng)求失敗
callback.onError(t);
callback.reqErrMsg();
}
}
});
}
}
3. RetrofitUtil使用
get無(wú)參請(qǐng)求
RetrofitUtil.get("/xx/xx", new RetrofitCallback() {
@Override
public void onSuccess(String resultJsonString) {
}
@Override
public void onError(Throwable t) {
}
});
get有參請(qǐng)求
Map<String,String> map = new HashMap<>(16);
map.put("key","value");
//xxx
RetrofitUtil.get("/xx/xx", map,new RetrofitCallback() {
@Override
public void onSuccess(String resultJsonString) {
xxxx
}
@Override
public void onError(Throwable t) {
xxxx
}
});
post請(qǐng)求和get的使用方法相似
最后
本次只對(duì)get和post進(jìn)行了封裝,項(xiàng)目中只用到了這些就沒(méi)有對(duì)文件上傳下載以及別的請(qǐng)求方式進(jìn)行封裝。且沒(méi)有添加轉(zhuǎn)換器,可在RetrofitManager的getRetrofit()方法中自行添加。大概的封裝思路就是這樣的,可以自行發(fā)揮。
此文也只是在記錄項(xiàng)目中對(duì)Retrofit的使用,對(duì)Retrofit的原理并沒(méi)有較深的了解。
到此這篇關(guān)于android Retrofit2網(wǎng)絡(luò)請(qǐng)求封裝介紹的文章就介紹到這了,更多相關(guān)android Retrofit2網(wǎng)絡(luò)封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android自定義滑動(dòng)接聽電話控件組實(shí)例
這篇文章主要介紹了Android自定義滑動(dòng)接聽電話控件組,接聽電話可以左右滑動(dòng),感興趣的小伙伴們可以參考一下。2016-10-10
Android使用BottomNavigationBar實(shí)現(xiàn)導(dǎo)航欄功能
這篇文章主要介紹了Android使用BottomNavigationBar實(shí)現(xiàn)導(dǎo)航欄功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
Android開發(fā)No Focused Window ANR產(chǎn)生原理解析
這篇文章主要為大家介紹了Android開發(fā)No Focused Window ANR產(chǎn)生原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Android實(shí)現(xiàn)標(biāo)題顯示隱藏功能
這篇文章主要介紹了Android實(shí)現(xiàn)標(biāo)題顯示隱藏功能2016-02-02
簡(jiǎn)單實(shí)用的Android UI微博動(dòng)態(tài)點(diǎn)贊效果
這篇文章主要為大家詳細(xì)介紹了簡(jiǎn)單實(shí)用的Android UI微博動(dòng)態(tài)點(diǎn)贊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android軟鍵盤的顯示隱藏功能實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了Android軟鍵盤的顯示隱藏功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03

