Lottie Stack Overflow

huangapple go评论78阅读模式
英文:

Lottie Stack Overflow

问题

I am programming a live stream function and the button is animated with lottie. I can't find anything wrong on the application but crashlytics shows this.

  1. Fatal Exception: java.lang.StackOverflowError: stack size 8192KB
  2. at android.view.View.findViewById(View.java:24941)
  3. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  4. at android.view.View.findViewById(View.java:24941)
  5. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  6. ... (repeated lines)
  7. at com.zurdo.presentation.features.home.HomeActivity.showLiveViewer(HomeActivity.kt:154)
  8. ... (repeated lines)
  9. at com.zurdo.presentation.features.home.HomeActivity.onCreate(HomeActivity.kt:34)
  10. ... (more lines)
  11. at com.zurdo.presentation.features.home.HomeActivity.showProfilePicture(HomeActivity.kt:140)
  12. ... (more lines)
  13. at com.zurdo.presentation.features.home.HomeActivity.setupView(HomeActivity.kt:252)
  14. ... (more lines)

Here is the code:

Activity_main.xml:

  1. <com.airbnb.lottie.LottieAnimationView
  2. android:id="@+id/btnLiveUser"
  3. android:layout_width="0dp"
  4. android:layout_height="60dp"
  5. android:elevation="10dp"
  6. android:layout_marginStart="5dp"
  7. android:layout_marginEnd="5dp"
  8. android:visibility="gone"
  9. app:layout_constraintTop_toTopOf="@id/goToStoreButton"
  10. app:layout_constraintEnd_toStartOf="@+id/goToStoreButton"
  11. app:layout_constraintStart_toEndOf="@id/publicationsButton"
  12. app:layout_constraintBottom_toBottomOf="@id/goToStoreButton"
  13. app:lottie_rawRes="@raw/btn_live_1"/>

HomeActivity.kt:

  1. package com.zurdo.presentation.features.home
  2. import android.animation.Animator
  3. import android.app.Activity
  4. import android.content.Intent
  5. import android.os.Bundle
  6. import android.view.KeyEvent
  7. import android.view.View
  8. import android.view.inputmethod.EditorInfo
  9. import android.widget.TextView
  10. import androidx.core.view.isVisible
  11. import androidx.fragment.app.FragmentManager
  12. import com.bumptech.glide.Glide
  13. import com.bumptech.glide.load.resource.bitmap.CircleCrop
  14. import com.google.android.play.core.appupdate.AppUpdateManager
  15. import com.google.android.play.core.install.InstallState
  16. import com.google.android.play.core.install.InstallStateUpdatedListener
  17. import com.google.android.play.core.install.model.InstallStatus
  18. import com.zurdo.R
  19. import com.zurdo.core.exception.Failure
  20. import com.zurdo.core.extension.getDynamicLinkId
  21. import com.zurdo.core.platform.BaseActivity
  22. import com.zurdo.core.platform.Constants
  23. import com.zurdo.core.platform.NavigationHelper
  24. import com.zurdo.core.platform.PreferenceHelper
  25. import com.zurdo.data.models.Publication
  26. import com.zurdo.data.models.User
  27. import com.zurdo.presentation.ZurdoApp
  28. import com.zurdo.presentation.features.onboarding.OnboardingActivity
  29. import com.zurdo.presentation.features.publicationDetail.publicationExtra
  30. import com.zurdo.presentation.features.publications.PublicationListFragment
  31. import com.zurdo.presentation.features.publications.pubDetaiRequestCode
  32. import com.zurdo.presentation.features.support.supportRequestCode
  33. import kotlinx.android.synthetic.main.activity_main.*
  34. import kotlinx.android.synthetic.main.custom_search_field.*
  35. import java.util.*
  36. import javax.inject.Inject
  37. import com.zurdo.presentation.features.publications.ReqCodeComments
  38. import com.zurdo.presentation.features.videostream.HOST
  39. import com.zurdo.presentation.features.videostream.IS_LIVE
  40. // Rest of the code...

It seems like there's a StackOverflowError in your code, and it's related to the HomeActivity.kt file, specifically in the showLiveViewer method. To reproduce this issue, you might be calling the showLiveViewer method in a way that causes a continuous loop or recursion, leading to a stack overflow.

To solve the issue, you should carefully review your code in the showLiveViewer method in the HomeActivity.kt file and ensure that you're not causing an infinite loop or recursion. It might be a logical error in the way you're handling animations or view visibility.

英文:

I am programming a live stream function and the button is animated with lottie. I can't find anything wrong on the application but crashlytics shows this.

  1. Fatal Exception: java.lang.StackOverflowError: stack size 8192KB
  2. at android.view.View.findViewById(View.java:24941)
  3. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  4. at android.view.View.findViewById(View.java:24941)
  5. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  6. at android.view.View.findViewById(View.java:24941)
  7. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  8. at android.view.View.findViewById(View.java:24941)
  9. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  10. at android.view.View.findViewById(View.java:24941)
  11. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  12. at android.view.View.findViewById(View.java:24941)
  13. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  14. at android.view.View.findViewById(View.java:24941)
  15. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  16. at android.view.View.findViewById(View.java:24941)
  17. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  18. at android.view.View.findViewById(View.java:24941)
  19. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  20. at android.view.View.findViewById(View.java:24941)
  21. at android.view.ViewGroup.findViewTraversal(ViewGroup.java:4745)
  22. at android.view.View.findViewById(View.java:24941)
  23. at android.view.Window.findViewById(Window.java:1481)
  24. at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:634)
  25. at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:259)
  26. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  27. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  28. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  29. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  30. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  31. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  32. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  33. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  34. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  35. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  36. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  37. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  38. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  39. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  40. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  41. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  42. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  43. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  44. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  45. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  46. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  47. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  48. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  49. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  50. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  51. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  52. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  53. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  54. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  55. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  56. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  57. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  58. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  59. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  60. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  61. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  62. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  63. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  64. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  65. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  66. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  67. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  68. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  69. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  70. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  71. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  72. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  73. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  74. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  75. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  76. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  77. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  78. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  79. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  80. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  81. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  82. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  83. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  84. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  85. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  86. at com.zurdo.presentation.features.home.HomeActivity.showLiveViewer(HomeActivity.kt:154)
  87. at com.zurdo.presentation.features.home.HomePresenter$onRefreshStatusLive$1$2.invoke(HomePresenter.kt:124)
  88. at com.zurdo.presentation.features.home.HomePresenter$onRefreshStatusLive$1$2.invoke(HomePresenter.kt:120)
  89. at com.zurdo.core.functional.Either.either(Either.kt:28)
  90. at com.zurdo.presentation.features.home.HomePresenter$onRefreshStatusLive$1.invoke(HomePresenter.kt:120)
  91. at com.zurdo.presentation.features.home.HomePresenter$onRefreshStatusLive$1.invoke(HomePresenter.kt:119)
  92. at com.zurdo.core.interactor.UseCase$invoke$2$1.invokeSuspend(UseCase.kt:17)
  93. at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
  94. at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
  95. at android.os.Handler.handleCallback(Handler.java:938)
  96. at android.os.Handler.dispatchMessage(Handler.java:99)
  97. at android.os.Looper.loop(Looper.java:223)
  98. at android.app.ActivityThread.main(ActivityThread.java:7680)
  99. at java.lang.reflect.Method.invoke(Method.java)
  100. at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
  101. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

Here is the code

Activity_main.xml:

  1. &lt;com.airbnb.lottie.LottieAnimationView
  2. android:id=&quot;@+id/btnLiveUser&quot;
  3. android:layout_width=&quot;0dp&quot;
  4. android:layout_height=&quot;60dp&quot;
  5. android:elevation=&quot;10dp&quot;
  6. android:layout_marginStart=&quot;5dp&quot;
  7. android:layout_marginEnd=&quot;5dp&quot;
  8. android:visibility=&quot;gone&quot;
  9. app:layout_constraintTop_toTopOf=&quot;@id/goToStoreButton&quot;
  10. app:layout_constraintEnd_toStartOf=&quot;@+id/goToStoreButton&quot;
  11. app:layout_constraintStart_toEndOf=&quot;@id/publicationsButton&quot;
  12. app:layout_constraintBottom_toBottomOf=&quot;@id/goToStoreButton&quot;
  13. app:lottie_rawRes=&quot;@raw/btn_live_1&quot;/&gt;

HomeActivity.kt:

  1. package com.zurdo.presentation.features.home
  2. import android.animation.Animator
  3. import android.app.Activity
  4. import android.content.Intent
  5. import android.os.Bundle
  6. import android.view.KeyEvent
  7. import android.view.View
  8. import android.view.inputmethod.EditorInfo
  9. import android.widget.TextView
  10. import androidx.core.view.isVisible
  11. import androidx.fragment.app.FragmentManager
  12. import com.bumptech.glide.Glide
  13. import com.bumptech.glide.load.resource.bitmap.CircleCrop
  14. import com.google.android.play.core.appupdate.AppUpdateManager
  15. import com.google.android.play.core.install.InstallState
  16. import com.google.android.play.core.install.InstallStateUpdatedListener
  17. import com.google.android.play.core.install.model.InstallStatus
  18. import com.zurdo.R
  19. import com.zurdo.core.exception.Failure
  20. import com.zurdo.core.extension.getDynamicLinkId
  21. import com.zurdo.core.platform.BaseActivity
  22. import com.zurdo.core.platform.Constants
  23. import com.zurdo.core.platform.NavigationHelper
  24. import com.zurdo.core.platform.PreferenceHelper
  25. import com.zurdo.data.models.Publication
  26. import com.zurdo.data.models.User
  27. import com.zurdo.presentation.ZurdoApp
  28. import com.zurdo.presentation.features.onboarding.OnboardingActivity
  29. import com.zurdo.presentation.features.publicationDetail.publicationExtra
  30. import com.zurdo.presentation.features.publications.PublicationListFragment
  31. import com.zurdo.presentation.features.publications.pubDetaiRequestCode
  32. import com.zurdo.presentation.features.support.supportRequestCode
  33. import kotlinx.android.synthetic.main.activity_main.*
  34. import kotlinx.android.synthetic.main.custom_search_field.*
  35. import java.util.*
  36. import javax.inject.Inject
  37. import com.zurdo.presentation.features.publications.ReqCodeComments
  38. import com.zurdo.presentation.features.videostream.HOST
  39. import com.zurdo.presentation.features.videostream.IS_LIVE
  40. const val publicationListFragmentTag: String = &quot;publicationListFragment&quot;
  41. class HomeActivity : BaseActivity(),
  42. HomeContract.View {
  43. private val UPDATE_CODE: Int = 100
  44. private lateinit var appUpdateManager: AppUpdateManager
  45. @Inject
  46. lateinit var presenter: HomeContract.Presenter
  47. private lateinit var publicationListFragment: PublicationListFragment
  48. @Inject
  49. lateinit var preferences : PreferenceHelper
  50. private val manager: FragmentManager = supportFragmentManager
  51. override fun layoutId() = R.layout.activity_main
  52. override fun onCreate(savedInstanceState: Bundle?) {
  53. super.onCreate(savedInstanceState)
  54. ZurdoApp.component.inject(this)
  55. if(!preferences.getBoolean(Constants.SPKEY_IS_NOT_FIRST_LAUNCH)){
  56. startActivity(Intent(this, OnboardingActivity::class.java))
  57. }
  58. presenter.view = this
  59. presenter.onCreate()
  60. btnLiveUser.setOnClickListener {
  61. goToStreamViewer()
  62. }
  63. //intent?.let {
  64. // val isLive = intent.getStringExtra(&quot;title&quot;) == &quot;Zurdo is live testing!&quot; //TODO(Temporal validation)
  65. //
  66. //}
  67. }
  68. private fun goToStreamViewer() {
  69. NavigationHelper.goToStreamView(this, false)
  70. }
  71. override fun goToStreamView() {
  72. NavigationHelper.goToStreamView(this, true)
  73. }
  74. override fun onNewIntent(intent: Intent?) {
  75. if (intent?.getBooleanExtra(HOST, true) == false) {
  76. if (intent.getBooleanExtra(IS_LIVE, false)) {
  77. presenter.verifyLiveActive()
  78. goToStreamViewer()
  79. }
  80. }
  81. if (!preferences.userToken.isNullOrEmpty()) {
  82. intent.getDynamicLinkId { id, isPotCast -&gt;
  83. goToPublication(id, isPotCast)
  84. this.intent = null
  85. }
  86. }
  87. super.onNewIntent(intent)
  88. }
  89. override fun showLiveHost() {
  90. goToLiveButton.isVisible = true
  91. ivBtnLive.isVisible = true
  92. }
  93. override fun showLiveViewerTemporal() {
  94. btnLiveUser.isVisible = true
  95. tvLiveUser.isVisible = true
  96. }
  97. override fun onResume() {
  98. super.onResume()
  99. presenter.onRefreshStatusLive()
  100. //checkIfUserIsPremium()
  101. //appUpdateManager = AppUpdateManagerFactory.create(this)
  102. //
  103. //// Returns an intent object that you use to check for an update.
  104. //val appUpdateInfoTask = appUpdateManager.appUpdateInfo
  105. //
  106. //// Checks that the platform will allow the specified type of update.
  107. //appUpdateInfoTask.addOnSuccessListener { appUpdateInfo -&gt;
  108. // if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
  109. // try {
  110. // appUpdateManager.startUpdateFlowForResult(
  111. // appUpdateInfo,
  112. // AppUpdateType.IMMEDIATE,
  113. // this,
  114. // UPDATE_CODE
  115. // )
  116. // } catch (e: IntentSender.SendIntentException) {
  117. // e.printStackTrace()
  118. // }
  119. // }
  120. //}
  121. if (!preferences.userToken.isNullOrEmpty()) {
  122. intent.getDynamicLinkId { id, isPotCast -&gt;
  123. goToPublication(id, isPotCast)
  124. intent = null
  125. }
  126. }
  127. }
  128. override fun showLiveViewer(show: Boolean) {
  129. if(show) {
  130. btnLiveUser.addAnimatorUpdateListener {
  131. tvLiveUser.isVisible = (btnLiveUser.progress * 100).toInt() &lt; 90
  132. }
  133. btnLiveUser.addAnimatorListener(object : Animator.AnimatorListener {
  134. override fun onAnimationStart(p0: Animator?) { println() }
  135. override fun onAnimationEnd(p0: Animator?) {
  136. btnLiveUser.playAnimation()
  137. }
  138. override fun onAnimationCancel(p0: Animator?) { println() }
  139. override fun onAnimationRepeat(p0: Animator?) { println() }
  140. })
  141. btnLiveUser.playAnimation()
  142. } else {
  143. btnLiveUser.removeAllAnimatorListeners()
  144. btnLiveUser.pauseAnimation()
  145. }
  146. btnLiveUser.isVisible = show
  147. tvLiveUser.isVisible = show
  148. }
  149. private fun checkIfUserIsPremium(){
  150. if(preferences.isUserPremium)
  151. layoutProfileButton.background = resources.getDrawable(R.drawable.bg_profile_border)
  152. else{
  153. layoutProfileButton.background = null
  154. }
  155. }
  156. override fun onDestroy() {
  157. presenter.onDestroy()
  158. super.onDestroy()
  159. }
  160. override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  161. super.onActivityResult(requestCode, resultCode, data)
  162. if (requestCode == supportRequestCode &amp;&amp; resultCode == Activity.RESULT_OK) {
  163. notify(R.string.sent_support_contact_text, coordinator)
  164. }else if(requestCode == pubDetaiRequestCode){
  165. //publicationListFragment.presenter.onHomeTapped()
  166. //publicationListFragment.presenter.fetchPublications(isHome = false, withProgress = false)
  167. //publicationListFragment.presenter.refreshPublications(false)
  168. publicationListFragment.updatePublication((data?.getSerializableExtra(publicationExtra) as Publication))
  169. }else if(requestCode == ReqCodeComments){
  170. publicationListFragment.updatePublication((data?.getSerializableExtra(publicationExtra) as Publication))
  171. }
  172. }
  173. override fun setupView() {
  174. publicationListFragment = PublicationListFragment.newInstance()
  175. manager.beginTransaction()
  176. .replace(
  177. R.id.containerLayout,
  178. publicationListFragment,
  179. publicationListFragmentTag
  180. )
  181. .commit()
  182. searchButton.setOnClickListener {
  183. presenter.onShowSearchField(true)
  184. }
  185. closeButton.setOnClickListener {
  186. presenter.onShowSearchField(false)
  187. }
  188. profileButton.setOnClickListener {
  189. presenter.onProfileButtonTapped()
  190. }
  191. goToStoreButton.setOnClickListener {
  192. presenter.onGoToStoreTapped()
  193. }
  194. goToLiveButton.setOnClickListener { presenter.onGoToStreamTapped() }
  195. publicationsButton.setOnClickListener {
  196. //publicationListFragment.presenter.onSearchPublicationsByFilter()
  197. publicationListFragment.presenter.onHomeTapped()
  198. //publicationListFragment.presenter.fetchPublications(isHome = true, withProgress = true)
  199. }
  200. premiumButton.setOnClickListener {
  201. presenter.onGoToStoreTapped()
  202. }
  203. logoHomeBtn.setOnClickListener{
  204. publicationListFragment.presenter.onHomeTapped()
  205. }
  206. /*
  207. publicationsButton.setOnTouchListener(OnTouchListener { v, me -&gt;
  208. if (me.action == MotionEvent.ACTION_DOWN) {
  209. } else if (me.action == MotionEvent.ACTION_MOVE) {
  210. val params = ViewGroup.LayoutParams(
  211. v.width,
  212. v.height,
  213. (me.rawX - v.width / 2).toInt(),
  214. (me.rawY - v.height).toInt()
  215. )
  216. v.layoutParams = params
  217. }
  218. true
  219. })
  220. */
  221. searchField.setOnEditorActionListener(object : TextView.OnEditorActionListener {
  222. override fun onEditorAction(p0: TextView?, p1: Int, p2: KeyEvent?): Boolean {
  223. if (p1 == EditorInfo.IME_ACTION_SEARCH) {
  224. p0?.text.toString().let {
  225. presenter.onSearchPublications(it.toLowerCase(Locale.getDefault()))
  226. }
  227. return true
  228. }
  229. return false
  230. }
  231. })
  232. }
  233. override fun showCustomSearchField(show: Boolean) {
  234. customSearchField.visibility = if (show) View.VISIBLE else View.GONE
  235. searchField.setText(&quot;&quot;)
  236. if (show) {
  237. searchField.requestFocus()
  238. showKeyboard()
  239. } else {
  240. hideKeyboard()
  241. //publicationListFragment.presenter.fetchPublications(withProgress = false)
  242. publicationListFragment.presenter.refreshPublications()
  243. }
  244. }
  245. override fun showProfilePicture(user: User?) {
  246. user?.let {
  247. Glide.with(this)
  248. .load(it.profileUrl)
  249. .transform(CircleCrop())
  250. .into(profileButton)
  251. checkIfUserIsPremium()
  252. }
  253. }
  254. override fun goToStoreView() = NavigationHelper.goToStoreView(this)
  255. override fun goToProfileView() {
  256. NavigationHelper.goToProfileView(this)
  257. }
  258. override fun searchPublications(filter: String) {
  259. hideKeyboard()
  260. publicationListFragment.presenter.onSearchPublicationsByFilter(filter)
  261. }
  262. override fun handleFailure(failure: Failure) {
  263. val message = when (failure) {
  264. Failure.DatabaseError -&gt; R.string.unable_to_get_user
  265. else -&gt; R.string.general_error_text
  266. }
  267. notify(message, coordinator)
  268. }
  269. var appUpdatedListener: InstallStateUpdatedListener = object : InstallStateUpdatedListener {
  270. override fun onStateUpdate(installState: InstallState) {
  271. if (installState.installStatus() == InstallStatus.DOWNLOADED) {
  272. notify(R.string.app_update_downloaded,coordinator)
  273. } else if (installState.installStatus() == InstallStatus.INSTALLED) {
  274. appUpdateManager.unregisterListener(this)
  275. }
  276. }
  277. }
  278. private fun goToPublication(id: Int, isPotCast: Boolean) {
  279. if (isPotCast) NavigationHelper.goToPublicationDetailPodcastView(this, id, 2091)
  280. else NavigationHelper.goToPublicationDetailView(this, id, 2091)
  281. }
  282. }

Could someone help telling me how to reproduce the issue and solve it? Thanks in advance

I have tried making multiple calls to overload the memory stack but nothing happened

答案1

得分: 0

看到你的堆栈跟踪,我们看到这个重复的部分:

在com.zurdo.presentation.features.home.HomeActivity.kt的第147行,HomeActivity的showLiveViewer方法内部的第2个匿名类的onAnimationEnd方法:

  1. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)

在Animator.java的第554行,Animator的AnimatorListener的onAnimationEnd方法:

  1. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)

在BaseLottieAnimator.java的第74行,BaseLottieAnimator的notifyEnd方法:

  1. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)

在LottieValueAnimator.java的第221行,LottieValueAnimator的endAnimation方法:

  1. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)

在LottieDrawable.java的第593行,LottieDrawable的playAnimation方法:

  1. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)

在LottieAnimationView.java的第599行,LottieAnimationView的playAnimation方法:

  1. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)

在HomeActivity.kt的第154行,HomeActivity的showLiveViewer方法:

  1. at com.zurdo.presentation.features.home.HomeActivity.showLiveViewer(HomeActivity.kt:154)

所以你陷入了一个循环,因为在onAnimationEnd方法中调用了playAnimation:

  1. override fun onAnimationEnd(p0: Animator?) {
  2. btnLiveUser.playAnimation()
  3. }

LottieDrawable的这次调用立即触发了endAnimation方法的调用,因此你的回调会被调用,它又调用了playAnimation,然后立即结束了动画,以此类推。

该类的源代码,我们可以看到:

  1. ...
  2. if (!animationsEnabled()) {
  3. setFrame((int) (getSpeed() &lt; 0 ? getMinFrame() : getMaxFrame()));
  4. animator.endAnimation(); // &lt;-- 关键部分在这里
  5. if (!isVisible()) {
  6. onVisibleAction = OnVisibleAction.NONE;
  7. }
  8. }
  9. ...

所以似乎如果动画实际被禁用,Lottie会立即调用动画结束回调。好的。那么为什么你的动画被禁用呢?再根据源代码:

  1. private boolean animationsEnabled() {
  2. return systemAnimationsEnabled || ignoreSystemAnimationsDisabled;
  3. }

因此,如果Android系统动画被禁用,而你没有告诉Lottie忽略它,那么动画将被禁用。

因此,似乎你的崩溃是因为禁用了系统动画。这应该很容易进行测试和确认。

英文:

Looking at your stacktrace, we see this recurring bit:

  1. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  2. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  3. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  4. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  5. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  6. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  7. at com.zurdo.presentation.features.home.HomeActivity$showLiveViewer$2.onAnimationEnd(HomeActivity.kt:147)
  8. at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
  9. at com.airbnb.lottie.utils.BaseLottieAnimator.notifyEnd(BaseLottieAnimator.java:74)
  10. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  11. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)
  12. at com.airbnb.lottie.LottieAnimationView.playAnimation(LottieAnimationView.java:599)
  13. at com.zurdo.presentation.features.home.HomeActivity.showLiveViewer(HomeActivity.kt:154)

So you're stuck in a loop because of the code that calls playAnimation in onAnimationEnd:

  1. override fun onAnimationEnd(p0: Animator?) {
  2. btnLiveUser.playAnimation()
  3. }

That call to the LottieDrawable is immediately triggering a call to end animation, so your callback gets called, which calls playAnimation, which immediately ends the animation, etc, etc:

  1. at com.airbnb.lottie.utils.LottieValueAnimator.endAnimation(LottieValueAnimator.java:221)
  2. at com.airbnb.lottie.LottieDrawable.playAnimation(LottieDrawable.java:593)

So why is this?

Looking at the source code for that class, we see:

  1. ...
  2. if (!animationsEnabled()) {
  3. setFrame((int) (getSpeed() &lt; 0 ? getMinFrame() : getMaxFrame()));
  4. animator.endAnimation(); // &lt;-- KEY BIT HERE
  5. if (!isVisible()) {
  6. onVisibleAction = OnVisibleAction.NONE;
  7. }
  8. }
  9. ...

So it seems Lottie calls the animation end callback immediately if the animation is actually disabled. OK. So why is your animation disabled? Again, according to the source code:

  1. private boolean animationsEnabled() {
  2. return systemAnimationsEnabled || ignoreSystemAnimationsDisabled;
  3. }

So it seems animations are disabled if the Android system animations are disabled and you haven't told Lottie to ignore that.

So it would seem that your crash occurs when you disable system animations. This should be easy to test and confirm.

huangapple
  • 本文由 发表于 2023年3月7日 04:00:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/75655313.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定