You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java转Kotlin新手请教如何调用含typealias回调的DataSource分页接口

问题错误点分析

你之前的写法存在几个核心问题:

  • DataSource是普通类,必须先实例化才能调用其成员方法,不能直接将类名作为实例或参数传递
  • FetchResponse是请求结束后由回调返回的结果类,不需要也不能自行构造使用
  • fetch是异步接口,返回结果只能在传入的FetchCompletionHandler回调中获取,无法同步直接赋值拿到结果
  • 要拿到完整的人员列表,需要循环分页拉取,直到返回的next标识为null才代表所有数据拉取完毕
正确实现代码
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast

class MainActivity : AppCompatActivity() {
    // 先实例化DataSource
    private val dataSource = DataSource()
    // 存储所有拉取到的人员列表
    private val allPeople = mutableListOf<Person>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 开始拉取第一页数据,next传null
        fetchPeople(null)
    }

    /**
     * 分页拉取人员的方法
     * @param next 分页标识,拉第一页传null
     */
    private fun fetchPeople(next: String?) {
        dataSource.fetch(next) { response, error ->
            // 先处理错误情况
            error?.let { fetchError ->
                Toast.makeText(this, "拉取失败:${fetchError.errorDescription}", Toast.LENGTH_SHORT).show()
                // 可根据需求添加重试逻辑,比如重新调用fetchPeople(next)
                return@fetch
            }

            // 处理成功返回的响应
            response?.let { fetchResponse ->
                // 把当前页的人员添加到总列表
                allPeople.addAll(fetchResponse.people)
                // 判断是否还有下一页
                if (fetchResponse.next != null) {
                    // 有下一页,继续拉取
                    fetchPeople(fetchResponse.next)
                } else {
                    // 所有数据拉取完成,此处可做UI更新等后续操作
                    Toast.makeText(this, "拉取完成,共${allPeople.size}条人员数据", Toast.LENGTH_SHORT).show()
                    // 测试打印所有人员信息
                    allPeople.forEach { person ->
                        println("人员ID:${person.id},姓名:${person.fullName}")
                    }
                }
            }
        }
    }
}
逻辑说明
  1. 实例化DataSource作为全局请求入口,避免重复创建实例导致数据重新初始化
  2. 封装递归的分页拉取方法,每次拉取完成后判断返回的next参数:不为空就继续传入该参数拉下一页,为空就代表所有数据拉完
  3. 回调已经通过Handler(Looper.getMainLooper())切换到主线程,可以直接在回调内更新UI,不需要额外切换线程
  4. 可根据业务需求补充错误重试、加载状态提示等逻辑

内容的提问来源于stack exchange,提问作者Wicaledon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:54:03