无法执行任务:任务已在运行

时间:2018-09-24 04:48:07

标签: android android-asynctask

我在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并防止发生此错误的任何想法?

谢谢。

2 个答案:

答案 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将同时执行。