Android Kotlin 请求方法代码
接口请求方法
POST 请求模板
package com.yourpackage.requestimport android.content.Context
import androidx.lifecycle.LifecycleOwner
import com.yourpackage.beans.RequestParams
import com.yourpackage.beans.ResponseData
import com.yourpackage.http.api.ApiDefine
import com.yourpackage.http.api.ApiRequest
import com.yourpackage.http.api.RequestResponse
import com.yourpackage.http.beans.Response
import com.yourpackage.http.utils.ToastyUtils
import com.eyinfo.android_pure_utils.utils.JsonUtils
import com.google.gson.Gson
import com.hjq.http.EasyHttp
import com.hjq.http.body.JsonRequestBody/*** POST请求模板* 用于发送带参数的POST请求并处理响应*/
class PostRequest {// 回调监听器var requestListener: RequestListener? = null// 回调接口定义interface RequestListener {fun onSuccess(data: List<ResponseData?>)}/*** 发送POST请求* @param context 上下文* @param lifecycleOwner 生命周期所有者* @param params 请求参数对象* @param isShowLoading 是否显示加载框* @param api 请求接口地址*/fun request(context: Context,lifecycleOwner: LifecycleOwner,params: RequestParams,isShowLoading: Boolean,api: String) {val apiDefine = ApiDefine(api)EasyHttp.post(lifecycleOwner).api(apiDefine).body(JsonRequestBody(JsonUtils.toJson(params))) // 将参数转为JSON.request(object : RequestResponse<Response<List<ResponseData?>>>(context, isShowLoading) {// 请求成功回调override fun onSuccess(response: Response<List<ResponseData?>>?) {// 打印请求参数和响应数据(调试用)println("请求参数: ${Gson().toJson(params)}")println("响应数据: ${Gson().toJson(response?.data)}")if (response?.code == ApiRequest.SUCCESS) {// 成功时回调response.data?.let { requestListener?.onSuccess(it) }} else {// 失败提示ToastyUtils.show(response?.message ?: "请求失败")}}// 网络请求失败回调override fun onHttpFail(throwable: Throwable) {super.onHttpFail(throwable)ToastyUtils.show(throwable.message)println("请求失败: ${throwable.message} : ${throwable.cause}")}})}
}
GET 请求模板
package com.yourpackage.requestimport android.content.Context
import androidx.lifecycle.LifecycleOwner
import com.yourpackage.beans.ResponseData
import com.yourpackage.http.api.ApiDefine
import com.yourpackage.http.api.ApiPaths
import com.yourpackage.http.api.ApiRequest
import com.yourpackage.http.api.RequestResponse
import com.yourpackage.http.beans.Response
import com.yourpackage.http.utils.ToastyUtils
import com.google.gson.Gson
import com.hjq.http.EasyHttp/*** GET请求模板* 用于发送无参数或URL参数的GET请求并处理响应*/
open class GetRequest {// 回调监听器open var requestListener: RequestListener? = null// 回调接口定义interface RequestListener {fun onSuccess(data: ResponseData?)}/*** 发送GET请求* @param context 上下文* @param lifecycleOwner 生命周期所有者* @param isShowLoading 是否显示加载框* @param api 请求接口地址(可从ApiPaths获取)*/fun request(context: Context,lifecycleOwner: LifecycleOwner,isShowLoading: Boolean,api: String) {val apiDefine = ApiDefine(api)EasyHttp.get(lifecycleOwner).api(apiDefine).request(object : RequestResponse<Response<ResponseData>>(context, isShowLoading) {// 请求成功回调override fun onSuccess(response: Response<ResponseData>?) {// 处理响应数据(如需要可保存到本地)response?.data?.let { // 示例:保存数据到SharedPreferences// UserSharedPreferencesUtils.getInstance().saveData(it.toString())}if (response?.code == ApiRequest.SUCCESS) {// 成功时回调requestListener?.onSuccess(response.data)}}// 网络请求失败回调override fun onHttpFail(throwable: Throwable) {super.onHttpFail(throwable)println("请求失败: ${throwable.message}")ToastyUtils.show("请求失败: ${throwable.message}")}})}
}
分页
分页数据模型类
import java.io.Serializableclass Pagination : Serializable {private var total = 0 // 总条数private var page = 0 // 当前页码private var pageSize = 0 // 每页条数fun getTotal(): Int = totalfun setTotal(total: Int?) {this.total = total ?: this.total}fun getPage(): Int = pagefun setPage(page: Int?) {this.page = page ?: this.page}fun getPageSize(): Int = pageSizefun setPageSize(pageSize: Int?) {this.pageSize = pageSize ?: this.pageSize}// 判断是否为最后一页fun isLastPage(): Boolean {return page * pageSize >= total}
}
分页处理器(核心控制类)
import com.eyinfo.android_pure_utils.utils.ObjectJudge
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.scwang.smart.refresh.layout.api.RefreshLayoutopen class PageHandler<Item> {private var currentPage: Int = 1 // 当前页码,默认从1开始private var pageSize: Int = 10 // 每页条数,默认10条private var items: MutableList<Item> = mutableListOf() // 数据集合// Getter和Setter方法fun setPageSize(pageSize: Int) {this.pageSize = pageSize}fun setCurrentPage(currentPage: Int) {this.currentPage = currentPage}fun setItems(items: MutableList<Item>) {this.items = items}fun getItems(): MutableList<Item> = itemsfun getCurrentPage(): Int = currentPagefun getPageSize(): Int = pageSize// 刷新数据(重新加载第一页)fun refresh() {onRequestData(currentPage, pageSize)}// 子类实现具体的网络请求逻辑protected open fun onRequestData(currentPage: Int, pageSize: Int) {}// 注册刷新控件的监听事件fun registerListener(refreshLayout: RefreshLayout) {// 下拉刷新逻辑refreshLayout.setOnRefreshListener { layout ->currentPage = 1items.clear()onRequestData(currentPage, pageSize)layout.finishRefresh() // 结束刷新动画}// 上拉加载更多逻辑refreshLayout.setOnLoadMoreListener { layout ->currentPage++onRequestData(currentPage, pageSize)layout.finishLoadMore() // 结束加载动画}}// 判断是否为空数据(第一页无数据)fun isEmptyData(data: MutableList<Item?>?, pageNum: Int): Boolean {return pageNum == 1 && ObjectJudge.isNullOrEmpty(data)}// 处理加载完成的数据fun loadDone(refreshLayout: SmartRefreshLayout, pagination: Pagination, data: MutableList<Item?>) {val currentPage = pagination.getPage()val pageSize = pagination.getPageSize()// 如果是第一页,先清空原有数据if (currentPage == 1) {items.clear()this.currentPage = 1}// 添加新数据if (!ObjectJudge.isNullOrEmpty(data)) {items.addAll(data as Collection<Item>)// 如果返回的数据少于每页应有的数量,说明没有更多数据了if (data.size < pageSize) {refreshLayout.finishLoadMoreWithNoMoreData()}} else {// 没有数据了refreshLayout.finishLoadMoreWithNoMoreData()}}
}
在 Fragment 中使用分页的示例代码
import android.os.Bundle
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import com.creatorsaijs.creatorai.databinding.FragmentCenterTextLayoutBinding
import com.creatorsaijs.creatorai.fragment.BaseFragmentclass YourListFragment : BaseFragment() {private var binding: FragmentCenterTextLayoutBinding? = nullprivate lateinit var yourAdapter: YourListAdapter // 你的适配器private val pageHandler: PageHandler<YourDataModel> = object : PageHandler<YourDataModel>() {override fun onRequestData(currentPage: Int, pageSize: Int) {super.onRequestData(currentPage, pageSize)// 构建请求参数val params = YourRequestParams()params.pageNumber = currentPageparams.pageSize = pageSize// 发起网络请求yourRequest.request(requireContext(), this@YourListFragment, params, true, yourApiPath)}}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)initRecyclerView()initPageHandler()initRequestListener()}private fun initRecyclerView() {binding?.recyclerView?.layoutManager = LinearLayoutManager(requireContext())yourAdapter = YourListAdapter(requireContext())yourAdapter.dataList = pageHandler.getItems()binding?.recyclerView?.adapter = yourAdapter}private fun initPageHandler() {// 注册刷新控件pageHandler.registerListener(binding?.refreshLayout!!)// 初始加载数据pageHandler.refresh()}private fun initRequestListener() {yourRequest.listener = object : YourRequestListener {override fun onSuccess(dataList: List<YourDataModel?>, pagination: Pagination) {// 处理空数据情况if (pageHandler.isEmptyData(dataList.toMutableList(), pagination.getPage())) {showEmptyView() // 显示空数据提示} else {hideEmptyView() // 隐藏空数据提示// 通知分页处理器数据加载完成pageHandler.loadDone(binding!!.refreshLayout, pagination, dataList.toMutableList())yourAdapter.notifyDataSetChanged() // 刷新列表}}}}// 空数据显示控制private fun showEmptyView() {binding?.refreshLayout?.visibility = View.GONEbinding?.emptyView?.visibility = View.VISIBLE}private fun hideEmptyView() {binding?.refreshLayout?.visibility = View.VISIBLEbinding?.emptyView?.visibility = View.GONE}
}