Вид добавлен программно без изменения видимости после долгого времени не используется - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть проблема, которую я еще не смог ни понять, ни решить.

В моем проекте Android есть BaseActivity.Там, среди других функций, я решил добавить функцию, чтобы при необходимости показывать или скрывать представление загрузки.Это работает как задумано, но иногда происходит ошибка.

Я постараюсь собрать некоторую важную информацию о моем проекте, который я считаю полезным.Мое приложение интегрировано с внешним приложением для входа.Я звоню, когда службы, которым я звоню, должны обновить свой токен.Когда пользователь входит в приложение, оно вызывает слушателя и возвращает мне контроль над моим.

Проблема заключается в следующем:

Я прихожу к занятию, которое требует вызова службы, и у меня все в порядке, но затем я блокирую телефон.После длительного периода времени я разблокирую телефон и, после той же активности, я снова вызываю службу.Моя активность показывает загрузчик как задумано, и, когда мой токен истек, я вызываю приложение входа в систему из его SDK.

Когда я возвращаюсь к своему приложению и вызываю нужную мне службу, приложение пытается скрыть загрузчик.Вот где происходит сбой, так как я не могу изменить видимость на GONE.Я искал его в иерархии представлений и нашел его, но с visibility = VISIBLE.

Вот фрагмент кода из загрузчика, надеюсь, кто-нибудь найдет, где я делаю ошибку!

abstract class BaseActivity : DaggerAppCompatActivity(){
    // These are the IDS of the Views I'm adding to the activity, so I can track them and change their visibility
    var imgLoadingID = -1
    var rvLoadingID = -1

    fun showLoading() {
        // If the views are added I show them
        if (imgLoadingID > 0 && rvLoadingID > 0) {
            val imageView = findViewById<ImageView>(imgLoadingID)
            val relativeLayout = findViewById<RelativeLayout>(rvLoadingID)
            relativeLayout.visibility = View.VISIBLE
            imageView.visibility = VISIBLE
            imageView.isClickable = false
            imageView.isFocusable = false
        } else {
            // else I create them and show them
            val imgLoading = ImageView(this)
            imgLoading.id = View.generateViewId()
            imgLoadingID = imgLoading.id

            val maxpx = CustomUtils.ViewUtils.converIntToDps(65, this)
            Glide.with(this).asGif().load(R.mipmap.loading).into(imgLoading)
            val relativeLayout = RelativeLayout(this)
            relativeLayout.id = View.generateViewId()
            rvLoadingID = relativeLayout.id

            var params = RelativeLayout.LayoutParams(maxpx, WRAP_CONTENT)
            params.addRule(RelativeLayout.CENTER_IN_PARENT)
            relativeLayout.addView(imgLoading, params)
            relativeLayout.background = getDrawable(R.color.pure_white_97)
            relativeLayout.isClickable = true
            relativeLayout.isFocusable = true

            findViewById<ViewGroup>(android.R.id.content).addView(relativeLayout, RelativeLayout.LayoutParams(MATCH_PARENT,  MATCH_PARENT))

            imgLoading.visibility = VISIBLE
        }
        // I lock the back button so people don't cancel my requests
        esBackPressedBlocked = true
    }

    // Here I find the views and change their visibility.
    fun hideLoading(){

        if(imgLoadingID > 0 && rvLoadingID > 0) {
            val imageView = findViewById<ImageView>(imgLoadingID)
            val relativeLayout = findViewById<RelativeLayout>(rvLoadingID)
            relativeLayout.visibility = View.GONE
            imageView.visibility = View.GONE
        }

        esBackPressedBlocked = false
    }
}

Я удалил некоторые журналы, которые добавил ко всей функции, но когда это не удается, он входит в функцию hideLoading(), даже в часть relativeLayout.visibility = View.GONE.

Раньше функция работала с представлениями как с целым объектом, а не с их идентификаторами, но я нашел его более надежным, и сохранение видов вместо их идентификаторов приводило к той же проблеме.

Моя главная проблема заключается в том, как Android управляет моим приложением, когда телефон заблокирован на этот период времени (сбои произошли после 8-10 часов бездействия).Я думаю, что-то там может быть создание этой проблемы.Я также подумал о внешнем приложении входа в систему, поскольку sdk запускает намерение своего приложения и вызывает меня из прослушивателя при возвращении, но, поскольку мой код выполняется, я думаю, что Android управляет моими взглядами странным образом.Или, может быть, я пытаюсь скрыть представление о загрузке, прежде чем я возобновлю работу ... Я действительно не знаю.

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

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

Спасибо !!

...