我在AsycnTask
内呼叫Adapter
,但是在滚动RecyclerView
时出现了一些错误,这就是错误。
E/MainAdapter: getAttachment failed
java.lang.IllegalStateException: Cannot execute task: the task is already running.
这是我的代码。
class MainAdapter(private dataSet: ArrayList<MyObject>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val disposable = CompositeDisposable()
// some stuff here...
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
disposable.add(
getApiService().getAttachment()
.subscribeOn(Schedulers.io())
.observerOn(AndroidSchedulers.mainThread())
.subscribe(
{ it ->
Log.i(TAG, "getAttachment success")
if (fileType.isImage) {
holder.imageLoader.execute(it.byteStream()) // the error is pointing here
} else if (fileType.isVideo) {
holder.videoLoader.execute(it.byteStream())
}
},
{
Log.e(TAG, "getAttachment fail", it)
}
)
)
}
class ItemViewHolder(itemView: View), OnMediaLoaderListener {
override fun onImageLoadFinish(bitmap: Bitmap) {
Glide.with(itemView)
.load(bitmap)
.into(itemView.img)
}
override fun onVideoLoadFinish(uri: Uri) {
itemView.video.setVideoURI(uri)
itemView.video.start()
}
val videoLoader = VideoLoader(this)
val imageLoader = ImageLoader(this)
}
class VideoLoader(private val listener: OnMediaLoaderListener): AsyncTask<InputStream, Void, File>() {
// some stuff here...
}
class ImageLoader(private val listener: OnMediaLoaderListener): AsyncTask<InputStream, Void, Bitmap>() {
// some stuff here...
}
}
interface OnMediaLoaderListener {
fun onVideoLoadFinish(uri: Uri)
fun onImageLoadFinish(bitmap: Bitmap)
}
我不为什么会出现此错误。
关于如何正确调用AsyncTask
内部的Adapter
并防止发生此错误的任何想法?
谢谢。
答案 0 :(得分:0)
AsyncTask
只能执行一次。根据您的情况,在onBindViewHolder中多次调用Execute。
每次执行都需要AsyncTask的新实例。
答案 1 :(得分:0)
您还可以使用executeOnExecutor
中的AsyncTask
。它们可以一次执行多个任务。
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
YOUR_TASK.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
YOUR_TASK.execute();
看看两者之间的区别如下:-
.execute()-此函数在单个后台线程的队列中调度任务。意味着如果您要调用两个AsyncTask并使用.execute()
方法来调用它们,它们将在队列中执行(第一个然后第二个)。
.executeOnExecutor()-如果要同时执行两个AsyncTasks
,则可以使用此方法来执行AsyncTask
。意味着两个asyncTask将同时执行。