Android AsyncTask没有更新进度栏

时间:2018-08-01 11:20:45

标签: android android-asynctask kotlin android-progressbar

你好,我的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)
}

1 个答案:

答案 0 :(得分:2)

怎么说,您-永远不会取消以前的异步任务。因为您每次都在刚刚创建的异步任务上调用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)
}

而且,我想您在检查return是否取消时应该在AsyncTask中进行操作。

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

请不要将!!与Kotlin一起使用。而是使用null检查或提供null的默认值。例子:

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