У меня есть проблема, которую я еще не смог ни понять, ни решить.
В моем проекте 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 управляет моими взглядами странным образом.Или, может быть, я пытаюсь скрыть представление о загрузке, прежде чем я возобновлю работу ... Я действительно не знаю.
Кстати, я знаю, что есть более простые решения для отображения загрузчика, но я хотелсоздать это самым чистым способом.Если у вас есть более чистый подход, я открыт для любого решения.
Если есть что-то неясное, дайте мне знать в комментариях, и я надеюсь, что мой английский был достаточно ясен, чтобы выразить себя, это сложная проблема, которую яне могу понять, поэтому мне трудно это объяснить.
Спасибо !!