Невозможно выполнить задачу: задача уже запущена - PullRequest
0 голосов
/ 24 сентября 2018

Я звоню 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 голосов
/ 24 сентября 2018

Вы также можете использовать executeOnExecutor из AsyncTask., Которые могут выполнять несколько задач одновременно.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
     YOUR_TASK.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 else
     YOUR_TASK.execute();

Обратите внимание на разницу между ними:

.execute () - Эта функция планирует задачу в очереди для одного фонового потока.Означает, что если вы вызываете две AsyncTasks и используете метод .execute() для их вызова, они будут выполняться в очереди (сначала, затем во второй).

.executeOnExecutor () - Если вы хотитепараллельное выполнение обоих AsyncTasks, вы можете использовать этот метод для выполнения AsyncTask.Означает, что обе асинхронные задачи будут выполняться одновременно.

0 голосов
/ 24 сентября 2018

AsyncTask может быть выполнен только один раз.Execute вызывается несколько раз внутри onBindViewHolder в вашем случае.

Для каждого выполнения требуется новый экземпляр AsyncTask.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...