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

如何每15分钟从数据库中依次逐条获取数据?

实现定时依次获取图片的问题修正

我的数据库中有10张图片,需要实现首次获取第一张图片后,每间隔15分钟依次获取下一张图片的功能,以下是我编写的代码:

database.addValueEventListener(object :ValueEventListener{
    override fun onDataChange(snapshot: DataSnapshot) {
        for (data in snapshot.children){
            val image = data.child("myimage").value.toString()
            val voice = data.child("myvoice").value.toString()
            imagedatas=Data.Builder().putString("image",image).build()
            val model=automodel(image,voice)
            binding.recyclerview.layoutManager= LinearLayoutManager(this@AutoChangeActivity)
            binding.recyclerview.layoutManager= GridLayoutManager(this@AutoChangeActivity,2)
            binding.recyclerview.adapter=adapter
        
            arrayList.add(model)
        }
        val myWorkRequest : PeriodicWorkRequest = PeriodicWorkRequestBuilder<WallpaperWorker>(1,
            TimeUnit.MINUTES)
            .setConstraints(constraints)
            .setInputData(imagedatas)
            .build()
        WorkManager.getInstance(this@AutoChangeActivity).enqueue(myWorkRequest)
    }
    override fun onCancelled(error: DatabaseError) {

    }

})

当前代码的核心问题

  1. 循环覆盖数据:遍历数据库时每次都重新赋值imagedatas,最终只会保留最后一张图片的地址,根本没法依次获取每一张。
  2. 定时间隔错误:需求是15分钟,但代码里设成了1分钟。
  3. RecyclerView布局冗余:先后设置两种布局管理器,后者直接覆盖前者,完全没必要。
  4. 无索引记录:没有保存当前已获取到第几张图的状态,无法实现“依次取下一张”的逻辑。

修正后的实现方案

1. 先保存所有图片数据并初始化索引

在onDataChange中把所有图片地址保存到本地(比如SharedPreferences),同时初始化当前图片索引为0(对应第一张图):

override fun onDataChange(snapshot: DataSnapshot) {
    val imageList = mutableListOf<String>()
    arrayList.clear() // 避免重复添加数据

    // 遍历数据库,收集所有图片和语音数据
    for (data in snapshot.children){
        val image = data.child("myimage").value.toString()
        val voice = data.child("myvoice").value.toString()
        imageList.add(image)
        arrayList.add(automodel(image, voice))
    }

    // 配置RecyclerView(只做一次)
    binding.recyclerview.layoutManager = GridLayoutManager(this@AutoChangeActivity, 2)
    binding.recyclerview.adapter = adapter
    adapter.notifyDataSetChanged() // 更新列表

    // 保存图片列表和初始索引到SharedPreferences
    val prefs = getSharedPreferences("ImageCyclePrefs", MODE_PRIVATE)
    with(prefs.edit()) {
        putStringSet("imageList", imageList.toSet())
        putInt("currentIndex", 0)
        apply()
    }

    // 先执行一次首次任务(立即获取第一张图)
    val initialWork = OneTimeWorkRequestBuilder<WallpaperWorker>()
        .setConstraints(constraints)
        .build()
    WorkManager.getInstance(this@AutoChangeActivity).enqueue(initialWork)

    // 启动15分钟间隔的周期性任务
    val periodicWork = PeriodicWorkRequestBuilder<WallpaperWorker>(15, TimeUnit.MINUTES)
        .setConstraints(constraints)
        .build()
    WorkManager.getInstance(this@AutoChangeActivity).enqueue(periodicWork)
}

2. 修改Worker类,实现依次取图逻辑

在WallpaperWorker中读取当前索引,获取对应图片,然后更新索引(循环到开头如果已到最后一张):

class WallpaperWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
    override fun doWork(): Result {
        val prefs = applicationContext.getSharedPreferences("ImageCyclePrefs", MODE_PRIVATE)
        val imageSet = prefs.getStringSet("imageList", emptySet()) ?: emptySet()
        val imageList = imageSet.toList()

        if (imageList.isEmpty()) return Result.failure()

        // 获取当前索引并更新
        var currentIndex = prefs.getInt("currentIndex", 0)
        val targetImage = imageList[currentIndex]

        // 这里写你的图片处理逻辑(比如加载并设置为壁纸)
        handleImage(targetImage)

        // 更新索引,循环复用
        currentIndex = (currentIndex + 1) % imageList.size
        prefs.edit().putInt("currentIndex", currentIndex).apply()

        return Result.success()
    }

    private fun handleImage(imageUrl: String) {
        // 实现图片加载、显示或设置壁纸的逻辑
    }
}

额外注意事项

  • 如果只需要一次性获取数据库数据,建议用addListenerForSingleValueEvent代替addValueEventListener,避免数据库更新时重复触发逻辑。
  • 图片加载过程中要处理网络异常、加载失败的情况,保证任务能正常执行下去。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:45:35