-
-
Notifications
You must be signed in to change notification settings - Fork 302
/
RetrofitManagerUse.kt
333 lines (289 loc) · 8.99 KB
/
RetrofitManagerUse.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
package afkt.project.base.http
import afkt.project.data_model.bean.ArticleBean
import dev.DevHttpCapture
import dev.DevHttpManager
import dev.DevUtils
import dev.capture.CallbackInterceptor
import dev.capture.CaptureInfo
import dev.capture.IHttpCaptureEnd
import dev.environment.DevEnvironment
import dev.http.manager.OkHttpBuilder
import dev.http.manager.OnRetrofitResetListener
import dev.http.manager.RetrofitBuilder
import dev.http.manager.RetrofitOperation
import dev.utils.LogPrintUtils
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Path
import java.util.concurrent.TimeUnit
/**
* detail: 玩 Android API Service
* @author Ttt
*/
interface WanAndroidService {
@GET("/article/list/{page}/json")
suspend fun getArticleList(@Path("page") page: Int): ArticleBean
}
/**
* detail: DevHttpManager RetrofitManager 使用示范
* @author Ttt
*/
class RetrofitManagerUse private constructor() {
companion object {
private val instance: RetrofitManagerUse by lazy { RetrofitManagerUse() }
// 日志 TAG
private val TAG = RetrofitManagerUse::class.java.simpleName
fun api(): WanAndroidService {
return instance.api()
}
fun operation(): RetrofitOperation {
return instance.operation()
}
}
// 全局通用 OkHttp Builder
private val mOkHttpBuilderGlobal = OkHttpBuilderGlobal()
// 全局 Retrofit 重新构建监听事件
private val mRetrofitResetListenerGlobal = RetrofitResetListenerGlobal()
init {
// 设置全局 OkHttp Builder 接口对象
DevHttpManager.RM.setOkHttpBuilder(
mOkHttpBuilderGlobal
)
// 设置全局 Retrofit 重新构建监听事件
DevHttpManager.RM.setRetrofitResetListener(
mRetrofitResetListenerGlobal
)
}
// =====================
// = WanAndroidService =
// =====================
@Volatile
private var mWanAndroidService: WanAndroidService? = null
fun api(): WanAndroidService {
if (mWanAndroidService == null) {
synchronized(WanAndroidService::class.java) {
if (mWanAndroidService == null) {
createAPI()
}
}
}
return mWanAndroidService as WanAndroidService
}
private fun createAPI() {
mWanAndroidService = operation().create(
WanAndroidService::class.java
)
}
// ==================
// = DevEnvironment =
// ==================
private fun apiBaseUrl(): HttpUrl {
return DevEnvironment.getServiceEnvironmentValue(
DevUtils.getContext()
).toHttpUrl()
}
// =====================
// = RetrofitOperation =
// =====================
/**
* 对外提供操作对象
* @return RetrofitOperation
*/
fun operation(): RetrofitOperation {
return mOperation
}
// Retrofit Operation
private val mOperation: RetrofitOperation by lazy {
DevHttpManager.RM.putRetrofitBuilder(
"MODULE_NAME", mRetrofitBuilder
)
}
// ===================
// = RetrofitBuilder =
// ===================
// Retrofit Builder 接口
private val mRetrofitBuilder: RetrofitBuilder by lazy {
object : RetrofitBuilder {
/**
* 创建 Retrofit Builder
* @param oldRetrofit 上一次构建的 Retrofit
* @param httpUrl 构建使用指定 baseUrl
* @param okHttp OkHttpClient 构建全局复用
* @return Retrofit.Builder
*/
override fun createRetrofitBuilder(
oldRetrofit: Retrofit?,
httpUrl: HttpUrl?,
okHttp: OkHttpClient.Builder?
): Retrofit.Builder {
return Retrofit.Builder().apply {
// Gson 解析
addConverterFactory(GsonConverterFactory.create())
// OkHttpClient
client((okHttp ?: OkHttpClient.Builder()).build())
// 服务器地址
baseUrl(httpUrl ?: apiBaseUrl())
}
}
// ==========
// = 通知事件 =
// ==========
/**
* 重新构建前调用
* @param key String
* @param oldRetrofit 上一次构建的 Retrofit
* 在 [createRetrofitBuilder] 之前调用
*/
override fun onResetBefore(
key: String,
oldRetrofit: Retrofit?
) {
}
/**
* 重新构建后调用
* @param key String
* @param newRetrofit 重新构建的 Retrofit 对象
* 在 [createRetrofitBuilder] 之后调用
*/
override fun onReset(
key: String,
newRetrofit: Retrofit?
) {
// 重新构建后创建新的代理对象
createAPI()
}
}
}
}
/**
* detail: 全局通用 OkHttp Builder
* @author Ttt
* 全局 ( 通过 Key 进行特殊化创建 )
* 可用于 [RetrofitBuilder.createRetrofitBuilder] okHttp 参数传入并创建
*/
class OkHttpBuilderGlobal : OkHttpBuilder {
/**
* 创建 OkHttp Builder
* @param key Key ( RetrofitBuilder Manager Key )
* @return OkHttpClient.Builder
*/
override fun createOkHttpBuilder(key: String): OkHttpClient.Builder {
// // 可搭配监听进度使用
// return ProgressManagerUse.operation().wrap(
// commonOkHttpBuilder(key)
// )
return commonOkHttpBuilder(key)
}
// ==========
// = 内部方法 =
// ==========
/**
* 通用 OkHttp Builder 创建方法
* @param key String
* @return OkHttpClient.Builder
*/
private fun commonOkHttpBuilder(key: String): OkHttpClient.Builder {
return OkHttpClient.Builder().apply {
// ==========
// = 通用配置 =
// ==========
// 全局的读取超时时间
readTimeout(60000L, TimeUnit.MILLISECONDS)
// 全局的写入超时时间
writeTimeout(60000L, TimeUnit.MILLISECONDS)
// 全局的连接超时时间
connectTimeout(60000L, TimeUnit.MILLISECONDS)
// =============
// = 不同版本构建 =
// =============
// 是否 Release 版本标记 ( 用于标记 APK 是否 Release 发布版本 )
if (!DevUtils.isDebug()) {
releaseOkHttpBuilder(key, this)
} else {
debugOkHttpBuilder(key, this)
}
}
}
// ===========
// = Release =
// ===========
/**
* release 版本构建 OkHttp Builder
* @param key String
* @param builder Builder
*/
private fun releaseOkHttpBuilder(
key: String,
builder: OkHttpClient.Builder
) {
builder.apply {
}
}
// =========
// = Debug =
// =========
/**
* debug 版本构建 OkHttp Builder
* @param key String
* @param builder Builder
*/
private fun debugOkHttpBuilder(
key: String,
builder: OkHttpClient.Builder
) {
builder.apply {
// 使用 DevHttpCapture 库进行 Http 拦截回调 ( 抓包数据存储 )
DevHttpCapture.addInterceptor(builder, "ModuleName")
// Http 抓包拦截器 ( 无存储逻辑, 进行回调通知 )
addInterceptor(CallbackInterceptor(endCall = object : IHttpCaptureEnd {
override fun callEnd(info: CaptureInfo) {
// 打印 Http 请求信息 log
LogPrintUtils.jsonTag(
key, info.toJson()
)
}
}))
}
}
}
/**
* detail: 全局 Retrofit 重新构建监听事件
* @author Ttt
*/
class RetrofitResetListenerGlobal : OnRetrofitResetListener {
/**
* 重新构建前调用
* @param key String
* @param oldRetrofit 上一次构建的 Retrofit
*/
override fun onResetBefore(
key: String,
oldRetrofit: Retrofit?
) {
oldRetrofit?.let { retrofit ->
val factory = retrofit.callFactory()
if (factory is OkHttpClient) {
// 重新构建则把之前的请求全部取消 ( 视情况自行处理 )
factory.dispatcher.cancelAll()
}
}
}
/**
* 重新构建后调用
* @param key String
* @param newRetrofit 重新构建的 Retrofit 对象
* 在 [onResetBefore] 之后调用
*/
override fun onReset(
key: String,
newRetrofit: Retrofit?
) {
newRetrofit?.let { retrofit ->
// 构建成功如自动请求等
}
}
}