【问题标题】:Android AsyncTask is not updating Progress BarAndroid AsyncTask 没有更新进度条
【发布时间】:2019-01-08 22:46:38
【问题描述】:

您好,我在使用 asynctask 时遇到问题。我播放了一首歌曲,然后将持续时间更新到进度条。但是当我播放一首新歌时,进度条不要回到第 0 位,进度条会继续使用旧值 这是我的代码:

class Task(context: Context, progressBar: ProgressBar) : AsyncTask<Int, Int, String>() {
@SuppressLint("StaticFieldLeak")
private var progressBar: ProgressBar? = progressBar
private var count = 0
override fun doInBackground(vararg input: Int?): String {
    while (count <= input[0]!!) {
        count++
        publishProgress(count)
        Thread.sleep(1000)
        if (isCancelled){
            count=0
        }
    }
    return "Task completed"
}

override fun onPreExecute() {
    progressBar!!.progress = 0
}

override fun onProgressUpdate(vararg values: Int?) {
    progressBar!!.progress = values[0]!!
}
}

当我播放歌曲时:

    override fun onItemClicked(position: Int, song: Song) {
    val secondsDuration = song.duration!! / 1000
    activity!!.pgbSong.max = secondsDuration
    val task = Task(context!!, activity!!.pgbSong)
    if (task.status == AsyncTask.Status.RUNNING) {
        task.cancel(true)
    }
    task.execute(song.duration)
}

【问题讨论】:

  • 如果解决了您的问题,请尝试改善社区并接受@Demigod 的回答。快乐编码!

标签: android android-asynctask kotlin android-progressbar


【解决方案1】:

好吧,该说什么 - 你永远不会取消以前的异步任务。因为您每次都在刚刚创建的异步任务上调用cancel(true)

val task = Task(context!!, activity!!.pgbSong)
if (task.status == AsyncTask.Status.RUNNING) {
    task.cancel(true)
}
task.execute(song.duration)

相反,您应该将之前的异步任务保存在对象变量中(类似这样):

private var asyncTask : AsyncTask<*,*,*>? = null

在方法调用之后:

override fun onItemClicked(position: Int, song: Song) {
    if (asyncTask.status == AsyncTask.Status.RUNNING) {
        asyncTask.cancel(true)
    }

    val secondsDuration = song.duration!! / 1000
    activity!!.pgbSong.max = secondsDuration
    asyncTask = Task(context!!, activity!!.pgbSong)
    asyncTask.execute(song.duration)
}

而且,我想,当您检查它是否取消时,您应该在 AsyncTask 中执行 return

但请不要以这种方式使用AsyncTask。因为它拥有链接视图和活动,可以防止那些被垃圾收集,从而导致内存泄漏。

请不要在 Kotlin 中使用 !!。而是使用null 检查或在null 时提供默认值。例子:

val int = object?.int ?: 0
val context = activity ?: return
val view = activity?.pgbSong ?: return // or if (view != null)

【讨论】:

  • 感谢您的帮助。我是 kotlin 的新手
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多