IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android整合搭建RxJava+Retrofit+LiveData+OkHttp框架实现MVVM模式开发(学习中) -> 正文阅读

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

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注入,根据自己实际情况来
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:19:09  更:2022-03-17 22:19:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:05:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码