Tabla de contenido
La biblioteca tripartita utilizada por el proyecto y sus ejemplos y materiales simples.
Introducción al uso de solicitudes de red
Introducción al uso del framework Google Jetpack
Desarrollo del marco Android Jetpack MVVM, basado en el desarrollo de AndroidX, uso tonto, adecuado para todos los proyectos
Modelo de vista de Google Android Team Jetpack:
representaciones
dependencias del proyecto
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
Paso 2. Agrega la dependencia
dependencies {
implementation 'com.github.cl-6666:mvvm-framework:v2.1.0'
}
Introducción
La biblioteca tripartita utilizada por el proyecto y sus ejemplos y materiales simples.
- kotlin
- Ciclo vital
- Ver modelo
- Datos en tiempo real
- Ver Encuadernación
- OkHttp : solicitud de red
- PersistentCookieJar : implementación persistente de CookieJar
- interceptor de registro : registros de red
- Retrofit : solicitudes de red
Introducción al uso de solicitudes de red
Introducción al uso de registros de red
lista de soporte de funciones api | Ya sea para apoyar |
---|---|
Admite salida con formato de datos de solicitud y respuesta http | apoyo |
Cuando la solicitud es Post, admite la impresión de Formulario | apoyo |
Admite la impresión de registros súper largos y resuelve el problema del truncamiento de caracteres Logcat 4K | apoyo |
Soporte para eliminar el borde de la línea vertical para mostrar el registro al formatear. Útil para copiar solicitudes de red a herramientas como Postman | apoyo |
Nivel de registro de soporte | apoyo |
Soporte para mostrar el nombre del hilo actual | apoyo |
Soporte para excluir la visualización de registros de algunas interfaces | apoyo |
- Representación del diagrama
con una línea horizontal en el lado izquierdo del registro
Sin línea horizontal en el lado izquierdo del registro
implementación predeterminada del interceptor de registro
- blog personalizado
//框架内部默认实现方法
object AndroidLoggingInterceptor {
@JvmOverloads
@JvmStatic
fun build(isDebug:Boolean = true, hideVerticalLine:Boolean = false, requestTag:String = "Request", responseTag:String = "Response"): LoggingInterceptor {
init()
return if (hideVerticalLine) {
LoggingInterceptor.Builder()
.loggable(isDebug) // TODO: 发布到生产环境需要改成false
.androidPlatform()
.request()
.requestTag(requestTag)
.response()
.responseTag(responseTag)
.hideVerticalLine()// 隐藏竖线边框
.build()
} else {
LoggingInterceptor.Builder()
.loggable(isDebug) // TODO: 发布到生产环境需要改成false
.androidPlatform()
.request()
.requestTag(requestTag)
.response()
.responseTag(responseTag)
// .hideVerticalLine()// 隐藏竖线边框
.build()
}
}
}
//普通网络日志显示写法
val httpLoggingInterceptor = HttpLoggingInterceptor { message ->
Log.e(
"网络日志", message
)
}
httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
//框架内部封装日志显示写法 hideVerticalLine = true代表隐藏横线
val loggingInterceptor = AndroidLoggingInterceptor.build(hideVerticalLine = true)
//需要显示日志带横线
val loggingInterceptor = AndroidLoggingInterceptor.build()
Relacionado con la configuración de red
- ¿Necesita habilitar https para ignorar el modo de certificado?
//双重校验锁式-单例 封装NetApiService 方便直接快速调用简单的接口
val apiService: ApiService by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
//type 为false 表示不使用htpps忽略证书验证
NetworkApi.INSTANCE.getApi(ApiService::class.java, BASE_URL, false)
}
- Introducción a la configuración relacionada con el interceptor de red
/**
* 实现重写父类的setHttpClientBuilder方法,
* 在这里可以添加拦截器,可以对 OkHttpClient.Builder 做任意操作
*/
override fun setHttpClientBuilder(builder: OkHttpClient.Builder): OkHttpClient.Builder {
builder.apply {
/** 设置缓存配置 缓存最大10M */
cache(Cache(File(appContext.cacheDir, "cxk_cache"), 10 * 1024 * 1024))
/** 添加Cookies自动持久化 */
cookieJar(cookieJar)
/** 演示添加缓存拦截器 可传入缓存天数,不传默认7天 */
addInterceptor(CacheInterceptor())
/** 演示添加公共heads 注意要设置在日志拦截器之前,不然Log中会不显示head信息 */
addInterceptor(MyHeadInterceptor())
/** 演示添加缓存拦截器 可传入缓存天数,不传默认7天 */
addInterceptor(CacheInterceptor())
/** 演示token过期拦截器演示 */
addInterceptor(TokenOutInterceptor())
/** 演示日志拦截器 您也可以自定义网络日志 */
addInterceptor(loggingInterceptor)
/** 超时时间 连接、读、写 */
connectTimeout(10, TimeUnit.SECONDS)
readTimeout(5, TimeUnit.SECONDS)
writeTimeout(5, TimeUnit.SECONDS)
}
return builder
}
- Introducción al módulo de descarga de red
//生成apk名字时间戳
val apkName = "inspection" + System.currentTimeMillis() + ".apk"
downLoad(
"TAG",
url,
FileUtil.getInstance().pluginRootPath,
apkName,
true,
true, //是否开启忽略https true-开启 默认不开启
object : OnDownLoadListener {
override fun onDownLoadPrepare(key: String) {
Log.i("TAG", "准备下载")
}
override fun onDownLoadError(
key: String,
throwable: Throwable
) {
Log.i("TAG", "下载失败")
}
override fun onDownLoadSuccess(
key: String,
path: String,
size: Long
) {
Log.i("TAG", "下载成功"+apkName)
}
override fun onDownLoadPause(key: String) {
Log.i("TAG", "下载暂停")
}
override fun onUpdate(
key: String,
progress: Int,
read: Long,
count: Long,
done: Boolean
) {
Log.i("TAG", "下载中")
}
})
- definición de interfaz api
interface ApiService {
/**
* 首页文章列表
*/
@GET("article/list/0/json")
suspend fun getEntryAndExitData(): ApiResponse<Data>
}
- Formato de devolución de red
{
"data": ...,
"errorCode": 0,
"errorMsg": ""
}
El formato de muestra es el formato de datos devuelto por la API de Android. Si el código de error es igual a 0, la solicitud es exitosa; de lo contrario, la solicitud falla. Desde el punto de vista del desarrollador, principalmente queremos obtener los datos de desempaquetado, y no queremos juzgar errorCode==0 cada vez Si la solicitud es exitosa o fallida En este momento, podemos heredar BaseResponse en la clase de base de datos de devolución del servidor e implementar métodos relacionados
data class ApiResponse<T>(var errorCode: Int, var errorMsg: String, var data: T) : BaseResponse<T>() {
// 这里是示例,wanandroid 网站返回的 错误码为 0 就代表请求成功,请你根据自己的业务需求来编写
override fun isSucces() = errorCode == 0
override fun getResponseCode() = errorCode
override fun getResponseData() = data
override fun getResponseMsg() = errorMsg
}
Introducción al uso del framework Google Jetpack
- En su proyecto, debe
build.gradle
agregar el archivo
buildFeatures {
viewBinding = true
dataBinding = true
}
- Solicitud de actividad para jugar caso Android api
class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>() {
private val mArticleListAdapter: ArticleListAdapter by lazy { ArticleListAdapter(arrayListOf()) }
override fun initView(savedInstanceState: Bundle?) {
mViewModel.apiArticleListData()
initRv()
}
private fun initRv() {
mDatabind.rvArticleList.init(LinearLayoutManager(this), mArticleListAdapter, false)
mViewModel.getArticleListData().observe(this) {
mArticleListAdapter.submitList(it.datas)
mArticleListAdapter.notifyDataSetChanged()
}
}
}
- El uso simple de ViewModel se presenta de la siguiente manera
class MainViewModel : BaseViewModel() {
private var articleListData: MutableLiveData<Data> = MutableLiveData()
/**
* 网络请求
*/
fun apiArticleListData() {
request({ apiService.getEntryAndExitData()},{
articleListData.value=it
},{
//失败
},true)
}
/**
* 获取数据
*/
fun getArticleListData(): MutableLiveData<Data> {
return articleListData
}
}
problema comun
- Cuando gradle-7.0 o superior, algunos dispositivos se deslizan no pueden cargar la solución de imagen
<application
........
android:requestLegacyExternalStorage="true"
........
>
dirección de github
dirección de github: GitHub - cl-6666/mvvm-framework: un conjunto de bibliotecas de desarrollo rápido basadas en la última arquitectura AAC de Google y el patrón de diseño MVVM