方便易用的Android網(wǎng)絡(luò)框架 YoungNet

YoungNet網(wǎng)絡(luò)庫傳送:youngnet

介紹

**youngnet**這個網(wǎng)絡(luò)庫抡砂,是基于retofit進(jìn)行封裝的。該框架支持restful api的請求铝条。

支持的請求方式有:get糖荒、post杉辙、put、delete捶朵、options蜘矢、patch、head

支持自定義數(shù)據(jù)解析對象

支持Token過期自動刷新模板攔截器

支持設(shè)置Retrofit的addConverterFactory和addCallAdapterFactory

支持設(shè)置Okhttp的addInterceptor和addNetworkInterceptor

當(dāng)前框架综看,對上面的方式歸為了三個構(gòu)建者:

- 1品腹、YoungNetWorking#createCommonClientCreator:這個構(gòu)建者,不包含請求體的红碑,

支持:get舞吭、delete、options、head

同步和異步調(diào)用都支持

- 2镣典、YoungNetWorking#createBodyClientCreator:這個構(gòu)建者兔毙,包含請求體,

支持:post兄春、put澎剥、patch

同步和異步調(diào)用都支持

- 2、YoungNetWorking#createDownUpClientCreator:這個構(gòu)建者赶舆,做上傳和下載的哑姚,

支持:單文件上傳、多文件上傳芜茵、單文件下載叙量、多文件下載,

支持上傳/下載的子進(jìn)度回調(diào)九串、總進(jìn)度回調(diào)

同步和異步調(diào)用都支持

Demo運(yùn)行效果圖

使用

一绞佩、初始化

在你的 application 中的 onCreate 方法中調(diào)用下面的代碼,進(jìn)行初始化配置:

可以參考初始化配置

NetInit.setBaseUrl(Constant.Host.HOST) //設(shè)置基礎(chǔ)的請求域名猪钮,需要一/結(jié)尾

.setCommonErrorCallback(object : ICommonErrorCallback {

override fun onCall(e: ApiException) {

//只要請求異常品山,都會調(diào)用當(dāng)前方法

//假如需要特殊處理,假如國際化烤低,或者想變換一下提示消息肘交,可以進(jìn)行下面的判斷,然后利用自定義的消息

//進(jìn)行提示扑馁,假如不需要涯呻,可以直接使用e.msg

//? ? ? ? ? ? ? ? ? ? when (e.code) {

//? ? ? ? ? ? ? ? ? ? ? ? ErrorCode.NETWORK_ERROR -> {

//? ? ? ? ? ? ? ? ? ? ? ? ? ? //網(wǎng)絡(luò)請求異常

//? ? ? ? ? ? ? ? ? ? ? ? }

//? ? ? ? ? ? ? ? ? ? ? ? ErrorCode.PARSE_ERROR -> {

//? ? ? ? ? ? ? ? ? ? ? ? ? ? //數(shù)據(jù)解析異常

//? ? ? ? ? ? ? ? ? ? ? ? }

//? ? ? ? ? ? ? ? ? ? ? ? ErrorCode.DOWNLOAD_EMPTY -> {

//? ? ? ? ? ? ? ? ? ? ? ? ? ? //下載的內(nèi)容為空

//? ? ? ? ? ? ? ? ? ? ? ? }

//? ? ? ? ? ? ? ? ? ? ? ? ErrorCode.UNKNOWN_ERROR -> {

//? ? ? ? ? ? ? ? ? ? ? ? ? ? //其他異常

//? ? ? ? ? ? ? ? ? ? ? ? }

//? ? ? ? ? ? ? ? ? ? }

showToast(e.msg ?: "")

}

})

.init(object : IDoNetConfig {

override fun onConfig(config: NetConfig) {

//普通api請求的配置

config

.addInterceptor(TestTokenInterceptor())

.addNetworkInterceptor(

HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {

override fun log(message: String) {

Log.e("shenlong", "message = $message")

}

}).setLevel(HttpLoggingInterceptor.Level.BODY)

)

}

}, object : IDoNetConfig {

override fun onConfig(config: NetConfig) {

//上傳下載api請求的配置

// RequestBody writeTo執(zhí)行兩次問題(722)http://www.reibang.com/p/705b1c461040

//從BODY改成HEADERS解決了重復(fù)調(diào)用問題

// okhttp添加日志攔截器,上傳文件RequestBody.writeTo調(diào)用兩次

// https://blog.csdn.net/u013626215/article/details/107014153

config.addNetworkInterceptor(

HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {

override fun log(message: String) {

Log.e("shenlong", "message = $message")

}

}).setLevel(HttpLoggingInterceptor.Level.HEADERS)

)

}

})

二腻要、代碼調(diào)用

- 1复罐、YoungNetWorking#createCommonClientCreator,具體的請求參考這里

YoungNetWorking.createCommonClientCreator("user", Any::class.java)

.addParam("userId", "${SystemClock.currentThreadTimeMillis()}")

.addHeader("agent","android-app")

.setGetCall(object : IGetCall {

override fun onGet(call: Call<*>) {

Log.e("shenlong", "call call call ${call}")

}

})

.build()

.get(object : ICallback {

override fun onFailure(e: ApiException) {

showResult(e.msg)

hideLoading()

}

override fun onSuccess(data: Any?) {

showResult(data?.toString())

hideLoading()

}

})

- 2闯第、YoungNetWorking#createBodyClientCreator市栗,具體的請求參考這里

val paramMap = mutableMapOf()

paramMap["userId"] = "${SystemClock.currentThreadTimeMillis()}"

paramMap["bookId"] = "${SystemClock.currentThreadTimeMillis()}"

YoungNetWorking.createBodyClientCreator("book", Any::class.java)

.setBody(

JsonUtil.toJson(paramMap)

.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())

)

.addHeader("agent", "android-app")

.setGetCall(object : IGetCall {

override fun onGet(call: Call<*>) {

Log.e("shenlong", "call call call ${call}")

}

})

.build()

.post(object : ICallback {

override fun onFailure(e: ApiException) {

showResult("post ${e.msg}")

hideLoading()

}

override fun onSuccess(data: Any?) {

showResult("post ${data?.toString()}")

hideLoading()

}

})

- 3、YoungNetWorking#createDownUpClientCreator咳短,具體的請求參考這里

下載:

val file = File(cacheDir, "hello.jpg")

YoungNetWorking.createDownUpClientCreator(

"https://ae01.alicdn.com/kf/Uf8cd7a9ee0054a1c85f95633ccb722fc3.jpg",

String::class.java

)

.addParam("hello", "hi")

.addHeader(

"shenlong",

"tian"

)

.build()

.download(file, getDownloadCallback("download"))

上傳:

YoungNetWorking.createDownUpClientCreator(

"https://imgbb.com/json",

Any::class.java

)

.addParam("action", "upload")

.addParam("auth_token", "232c8e0cdb5e960cfc2233b80bd8ad7345b17090")

.addParam("timestamp", "1630168059700")

.addParam("type", "file")

.build()

.upload("source", file, getUploadCallback(stringBuffer),

object : ICallback {

override fun onFailure(e: ApiException) {

stringBuffer.append("onFailure = ${e.msg} ${e.message}")

showResult(stringBuffer.toString())

}

override fun onSuccess(data: Any?) {

stringBuffer.append("onSuccess = ${data}")

showResult(stringBuffer.toString())

}

})

三、自定義數(shù)據(jù)解析對象

可以創(chuàng)建一個類繼承 IDataParser 去實(shí)現(xiàn)解析框架的替換

NetInit.setBaseUrl(Constant.Host.HOST) // 設(shè)置基礎(chǔ)的請求域名蛛淋,需要一 / 結(jié)尾

.dataParser(object :IDataParser() {

override fun parseJson(jsonStr: String, dataType: Type): T {

return null;

}

? ? ? ? ? ? })

四咙好、自定義token過期自動刷新攔截器

創(chuàng)建一個類繼承 TokenInterceptor ,然后實(shí)現(xiàn)其中的抽象方法即可褐荷,

可以參考這里

五勾效、其他

1、當(dāng)前項(xiàng)目已經(jīng)加入了混淆配置,不需要額外添加混淆配置层宫;

2杨伙、如果自己增加了Retrofit的請求方法,可以通過ApiCreateUtil#create或者ApiCreateUtil#createDownService去創(chuàng)建對應(yīng)的api請求類萌腿;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末限匣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子毁菱,更是在濱河造成了極大的恐慌米死,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贮庞,死亡現(xiàn)場離奇詭異峦筒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窗慎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門物喷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遮斥,你說我怎么就攤上這事脯丝。” “怎么了伏伐?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵宠进,是天一觀的道長。 經(jīng)常有香客問我藐翎,道長材蹬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任吝镣,我火速辦了婚禮堤器,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘末贾。我一直安慰自己闸溃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布拱撵。 她就那樣靜靜地躺著辉川,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拴测。 梳的紋絲不亂的頭發(fā)上乓旗,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音集索,去河邊找鬼屿愚。 笑死汇跨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妆距。 我是一名探鬼主播穷遂,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娱据!你這毒婦竟也來了蚪黑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吸耿,失蹤者是張志新(化名)和其女友劉穎祠锣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咽安,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伴网,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妆棒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澡腾。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖糕珊,靈堂內(nèi)的尸體忽然破棺而出动分,到底是詐尸還是另有隱情,我是刑警寧澤红选,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布澜公,位于F島的核電站,受9級特大地震影響喇肋,放射性物質(zhì)發(fā)生泄漏坟乾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一蝶防、第九天 我趴在偏房一處隱蔽的房頂上張望甚侣。 院中可真熱鬧,春花似錦间学、人聲如沸殷费。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽详羡。三九已至,卻和暖如春氮采,著一層夾襖步出監(jiān)牢的瞬間殷绍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工鹊漠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留主到,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓躯概,卻偏偏與公主長得像登钥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子娶靡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容