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