Как настроить GIF для бесперебойной работы во время выполнения кода? - PullRequest
0 голосов
/ 23 января 2020

У меня есть Активность, которая должна отображать GIF, когда за ней происходят тяжелые вещи. Я не обращаюсь к спа sh экранам. Gif находится в том же макете, что и другие представления.

Вариант использования: 1. Активность запускается, и я устанавливаю видимость представления, где GIF стоит, на TRUE 2. Запуск службы Forground и некоторые запросы (asyn c) на сервер сделаны для получения контента (блоки GIF здесь, и я не знаю почему) 3. После того, как служба завершает сетевые задания, вызывается обратный вызов, и представление с GIF устанавливается в GONE.

Если я заменю gif на ProgressBar, замораживание не произойдет. Он вращается, пока я не установлю его на GONE.

Я использую Glide, чтобы отобразить GIF. Вот код активности - xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/inject_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

<!--    <pl.droidsonroids.gif.GifImageView-->
<!--        android:visibility="gone"-->
<!--        android:id="@+id/view_download_progress"-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="match_parent"-->
<!--        android:background="@color/white"-->
<!--        android:src="@drawable/service_download_content"/>-->

    <ProgressBar
        android:visibility="gone"
        android:id="@+id/view_download_progress"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:background="@color/white"/>

<!--    <ImageView-->
<!--        android:visibility="gone"-->
<!--        android:id="@+id/view_download_progress"-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="match_parent"-->
<!--        android:background="@color/white" />-->
</RelativeLayout>

ОБНОВЛЕНИЕ: так я переключаю видимость

        ImageView downloadProgress = findViewById(R.id.view_download_progress);
        if (value) {
            Glide.with(getContext()).asGif().load(R.drawable.test).into(downloadProgress);
            downloadProgress.setVisibility(View.VISIBLE);
        } else {
            downloadProgress.setVisibility(View.GONE);
        }

ОБНОВЛЕНИЕ2: прокомментированный метод выполняет тяжелую работу SQLite после обратного вызова дооснащения вызывается внутри задания, которое выполняется внутри службы. GIF не замерзнет, ​​если я сделаю это.

                    override fun onResponse(call: Call<ObjectsSchema>, response: Response<ObjectsSchema>) {
                        val cmsContent = response.body() as ObjectsSchema
//                        handleContent(cmsContent)
                        notifyOnDownloadSucceded()
                    }

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Я обработал проблему с сопрограммой.

    fun executeAsync() {
        mStlClubApi.downloadCmsBulkData(mUrl, mQuery)
                .enqueue(object: Callback<ObjectsSchema> {
                    override fun onFailure(call: Call<ObjectsSchema>, t: Throwable) {
                        notifyOnDownloadFailed()
                    }

                    override fun onResponse(call: Call<ObjectsSchema>, response: Response<ObjectsSchema>) {
                        val cmsContent = response.body() as ObjectsSchema

                        CoroutineScope(IO).launch {
                            asyncHandleAndNotify(cmsContent)
                        }
                    }
                })
    }

    private suspend fun asyncHandleAndNotify(cmsContent: ObjectsSchema) {
        handleContent(cmsContent)
        notifyOnDownloadSucceded()
    }
    abstract suspend fun handleContent(cmsContent: ObjectsSchema)

Однако я до сих пор не знаю, почему он блокирует GIF, если задания выполняются в контексте службы Foreground, но я думаю, что это тема для другого вопроса и глубокой отладки.

0 голосов
/ 23 января 2020

Я рекомендую использовать Glide для загрузки GIF. Я построил проект на GitHub, который использует его для загрузки GIF в AlertDialog.

android -dialog

Glide.with(activity)
            .load(imageUrl)
            .into(customView.imageDialog)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...