Lazy must-have Jetpack MVVM framework

Tabla de contenido

representaciones

dependencias del proyecto

Introducción

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

problema comun

dirección de github


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.

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

Supongo que te gusta

Origin blog.csdn.net/a214024475/article/details/130625856
Recomendado
Clasificación