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}") } } } } } }
逻辑说明
- 实例化
DataSource作为全局请求入口,避免重复创建实例导致数据重新初始化 - 封装递归的分页拉取方法,每次拉取完成后判断返回的
next参数:不为空就继续传入该参数拉下一页,为空就代表所有数据拉完 - 回调已经通过
Handler(Looper.getMainLooper())切换到主线程,可以直接在回调内更新UI,不需要额外切换线程 - 可根据业务需求补充错误重试、加载状态提示等逻辑
内容的提问来源于stack exchange,提问作者Wicaledon
相关产品推荐
相关产品推荐

