Android整合搭建RxJava+Retrofit+LiveData+OkHttp框架实现MVVM模式开发(学习中)

这段代码展示了如何在Android应用程序中使用LiveData和Retrofit库进行登录验证以及数据删除操作。ViewModel层负责调用Repository,Repository通过Retrofit接口与服务器交互。登录成功后,令牌存储到本地,错误信息则打印到日志。
摘要由CSDN通过智能技术生成
class LiveDataRetrofitActivity:AppCompatActivity() {
    private lateinit var viewModel: LoginViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_livedata)
        viewModel=  ViewModelProvider(this).get(LoginViewModel::class.java)

    }

    fun login(view: View) {
        viewModel.login(LoginVo("123456","admin"))
            .observe(this,
                Observer<BaseDto<LoginDto>> { t ->
                    t?.let {loginDtoBaseDto->
                        if (loginDtoBaseDto.meta?.status == 200){
                            SPUtil.setString(Constant.TOKEN,loginDtoBaseDto.data?.token.toString())
                            Log.e("AAA",loginDtoBaseDto.data?.token.toString())
                        }else{
                            Log.e("AAA",loginDtoBaseDto.meta?.message.toString())
                        }
                    }
                })
    }

    fun deleteRoute(view: View) {
        viewModel.deleteRoute("16cb1536859f46c6960551ad83b293c2")
            .observe(this,
                Observer<BaseDto<String?>> { t ->
                   Log.e("DELETE:",Gson().toJson(t))
                })
    }

}
class LoginViewModel:ViewModel() {
    fun login(loginVo: LoginVo):LiveData<BaseDto<LoginDto>>{
        return LoginRepository().login(loginVo)
    }

    fun deleteRoute(id:String):LiveData<BaseDto<String?>>{
        return LoginRepository().deleteRoute(id)
    }

    fun sysUserPaging(pageNum: Int, pageSize: Int): LiveData<BaseDto<SysUserDto>>{
        return LoginRepository().sysUserPaging(pageNum,pageSize)
    }


}
class LoginRepository : BaseRepository(), ILoginRepository, IRouteRepository, ISysUserRepository {
    override fun login(loginVo: LoginVo): LiveData<BaseDto<LoginDto>> {
        return request(
            RequestRetrofit.getInstance(ApiService::class.java).login(loginVo)
        ).data
    }

    override fun deleteRoute(id: String): LiveData<BaseDto<String?>> {
        return request(
            RequestRetrofit.getInstance(ApiService::class.java).patrolRouteDeleteId(id)
        ).data
    }

    override fun sysUserPaging(pageNum: Int, pageSize: Int): LiveData<BaseDto<SysUserDto>> {
        return request(
            RequestRetrofit.getInstance(ApiService::class.java).sysUserPaging(pageNum, pageSize)
        ).data
    }

}
object RequestRetrofit {
    /**
     * 创建okhttp相关对象
     */
    private var okHttpClient: OkHttpClient? = null

    private var retrofit: Retrofit? = null

    fun <T> getInstance(service: Class<T>): T {
        if (okHttpClient == null) {
            synchronized(RequestRetrofit::class.java) {
                if (okHttpClient == null) {
                    okHttpClient = OkHttpClient.Builder()
                        .addInterceptor(
                            HttpLoggingInterceptor {
                                //访问网络请求,和服务端响应请求时。将数据拦截并输出
                                if ("401" in it) SPUtil.remove(Constant.TOKEN)
                                Log.e("HTTP", it)
                            }.setLevel(HttpLoggingInterceptor.Level.BODY)
                        )
                        .connectTimeout(20, TimeUnit.SECONDS)
                        .readTimeout(20, TimeUnit.SECONDS)
                        .writeTimeout(20, TimeUnit.SECONDS)
                        .addNetworkInterceptor(StethoInterceptor())
                        .addInterceptor(AddCookiesInterceptor())
//                        .addInterceptor(ReceivedCookiesInterceptor())
                        .build()
                }
            }
        }


        if (retrofit == null) {
            synchronized(RequestRetrofit::class.java) {
                if (retrofit == null) {
                    retrofit = Retrofit.Builder()
                        .baseUrl(ApiConfig.BaseUrl)
                        .client(okHttpClient!!)
                        .addConverterFactory(GsonConverterFactory.create())
                        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                        .addCallAdapterFactory(CoroutineCallAdapterFactory())
                        .build()
                }
            }
        }

        return retrofit!!.create(service)
    }

}
class BaseDto<T> : Serializable{
    var meta: MetaData?=null
    var data: T?=null
}

data class MetaData(
    var message: String?,
    var status: Int,
    var success: Boolean
)
open class BaseRepository {

    /**
     * 请求网络
     * @param flowable
     * @param <T>
     * @return
     */
    fun <T> request(flowable: Flowable<BaseDto<T>>): BaseHttpSubscriber<T> {
        val baseHttpSubscriber = BaseHttpSubscriber<T>() //RxJava Subscriber回调
        flowable.subscribeOn(Schedulers.io()) //解决背压
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(baseHttpSubscriber)

        return baseHttpSubscriber
    }
}
class PageKeyedSource : PagingSource<Int, SysUserInfo>() {
    override fun getRefreshKey(state: PagingState<Int, SysUserInfo>): Int? {
        return state.anchorPosition?.let { anchorPosition ->
            state.closestPageToPosition(anchorPosition)?.prevKey
        }
    }

    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, SysUserInfo> {
        return try {
            //页码未定义置为1
            val currentPage = params.key ?: 1

            val data = RequestRetrofit.getInstance(ApiService::class.java).sysUserPaging2(
                currentPage,
                20
            ).data

            val nextPage = if (currentPage < data?.pages?:0){
                currentPage + 1
            }else{
                null
            }

            if (data != null) {
                LoadResult.Page(
                    data = data.list,
                    prevKey = null,
                    nextKey = nextPage
                )
            } else {
                LoadResult.Error(throwable = Throwable())
            }
        } catch (e: IOException) {
            LoadResult.Error(e)
        } catch (e: HttpException) {
            LoadResult.Error(e)
        }
    }
}
interface ILoginRepository {

    fun login(loginVo: LoginVo): LiveData<BaseDto<LoginDto>>?

}

interface IRouteRepository {

    fun deleteRoute(id: String): LiveData<BaseDto<String?>>?

}

interface ISysUserRepository {

    fun sysUserPaging(pageNum: Int, pageSize: Int): LiveData<BaseDto<SysUserDto>>?

}
代码是19年写的了,发上来留个念。AddCookiesInterceptor里只是一个header注入,根据自己实际情况来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于搭建 Android MVVM 框架的详细教程,可以参考以下步骤: 1. 在项目添加相关依赖库: ``` def lifecycle_version = "2.2.0" def retrofit_version = "2.9.0" def okhttp_version = "4.9.0" implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" implementation "com.squareup.okhttp3:okhttp:$okhttp_version" implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version" ``` 2. 创建 MVVM 架构的三个核心类:Model、ViewModel 和 View。 - Model:数据模型,负责获取数据和处理数据逻辑。 - ViewModel:数据视图模型,负责管理 View 的数据,与 Model 交互获取数据,以便方便地展示 View。 - View:视图,负责展示数据并与用户交互。 3. 在 View 使用 Data Binding,简化数据绑定的操作。 4. 使用 ViewModelProviders.of() 方法获取 ViewModel,在 View 观察 LiveData实现数据显示的自动更新。 5. 在 Model 使用 Retrofit+OkHttp 的组合,获取网络数据。可以使用 Gson 来方便地进行数据解析。 6. 使用 LiveData 来处理 Model 获取的数据,确保数据的及时更新和传递。 以上就是简单的 Android MVVM 框架搭建教程,希望可以帮助到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值