#android #android-fragments #crash #android-emulator #layout-inflater
#Android #android-фрагменты #сбой #android-эмулятор #компоновка-надуватель
Вопрос:
Мое приложение выходит из строя после возврата в onCreateView фрагмента. Трассировка стека, которую я получаю,:
D/MenuAtividadesFragment: onCreate: Cheguei no onCreate
D/MenuAtividadesFragment: onCreateView: Cheguei no On createView
I/zygote: Starting a blocking GC NativeAllocBlocking
D/skia: --- allocation failed for scaled bitmap
I/zygote: Compiler allocated 4MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
D/MenuAtividadesFragment: onViewCreated: Cheguei em On View Created
I/Choreographer: Skipped 1195 frames! The application may be doing too much work on its main thread.
D/skia: external/skia/include/core/SkBitmap.h:282: fatal error: "sk_throw"
A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 11765 (.aplicativo_rdo), pid 11765 (.aplicativo_rdo)
Disconnected from the target VM, address: 'localhost:51879', transport: 'socket'
Он возвращает фатальный сигнал 6, но в настоящее время я только увеличиваю представление.
package com.eim.rdoApplication.ui.fragment
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnimationUtils
import android.widget.AutoCompleteTextView
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.cardview.widget.CardView
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.eim.rdoApplication.R
import com.eim.rdoApplication.data.model.entity.ActivityEntity
import com.eim.rdoApplication.data.model.entity.InstallationReportEntity
import com.eim.rdoApplication.data.model.openWeatherApi.CurrentLocationInformation
import com.eim.rdoApplication.ui.viewModel.DepartmentsMenuViewModel
import com.eim.rdoApplication.utils.GPSUtilsKotlin
import com.eim.rdoApplication.utils.Resource
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.collect
import kotlin.coroutines.CoroutineContext
private const val TAG = "MenuAtividadesFragment"
@AndroidEntryPoint
class HomeFragment:Fragment(), CoroutineScope, TryAgainNetworkListener {
private val navController by lazy {
findNavController()
}
lateinit var loadingImageView: ImageView
lateinit var loadingBg: ImageView
lateinit var autoCompleteTextView: AutoCompleteTextView
lateinit var reportTitleTextView:TextView
lateinit var rootView: View
private val args: HomeFragmentArgs by navArgs()
private val departmentsMenuViewModel:DepartmentsMenuViewModel by viewModels()
lateinit var dialogFragment: NetworkErrorFragment
private var job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.IO job
private var installationsReports: List<InstallationReportEntity>?=null
override fun onCreate(savedInstanceState: Bundle?) {
departmentsMenuViewModel.installationReportId = args.installationReportId
super.onCreate(savedInstanceState)
Log.d(TAG, "onCreate: Cheguei no onCreate")
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
Log.d(TAG, "onCreateView: Cheguei no On createView")
rootView = inflater.inflate(
R.layout.fragment_new_home_screen_updated,
container,
false
)
// setupReloadButton()
// setupLoadingViews()
// getUserInformation()
// setupCardViews()
// setupWeather()
return rootView
}
По-видимому, причиной сбоя является только раздувание представления.
Еще одна интересная вещь заключается в том, что представление фрагмента может увеличиваться при запуске на виртуальном устройстве Android (Pixel 3 API 30), но сбой на реальном устройстве (Motorola G5S API 26).
Я был бы признателен, если бы кто-нибудь мог помочь мне найти причину этого.
[ОТРЕДАКТИРОВАНО] Итак, ребята, я установил LeakCanary, чтобы попытаться сузить возможную утечку памяти, и, оказывается, я приблизился к причине. Это отчет, который он мне дает:
====================================
HEAP ANALYSIS RESULT
====================================
1 APPLICATION LEAKS
References underlined with "~~~" are likely causes.
Learn more at https://squ.re/leaks.
3054 bytes retained by leaking objects
Signature: 108d5f2862bd8da48823273827314afbdcc2540
┬───
│ GC Root: Local variable in native code
│
├─ android.os.HandlerThread instance
│ Leaking: NO (PathClassLoader↓ is not leaking)
│ Thread name: 'LeakCanary-Heap-Dump'
│ ↓ HandlerThread.contextClassLoader
├─ dalvik.system.PathClassLoader instance
D/LeakCanary: │ Leaking: NO (InternalLeakCanary↓ is not leaking and A ClassLoader is never leaking)
│ ↓ PathClassLoader.runtimeInternalObjects
├─ java.lang.Object[] array
│ Leaking: NO (InternalLeakCanary↓ is not leaking)
│ ↓ Object[].[616]
├─ leakcanary.internal.InternalLeakCanary class
│ Leaking: NO (MainActivity↓ is not leaking and a class is never leaking)
│ ↓ static InternalLeakCanary.resumedActivity
├─ com.eim.rdoApplication.ui.activity.MainActivity instance
│ Leaking: NO (NavHostFragment↓ is not leaking and Activity#mDestroyed is false)
│ mApplication instance of com.eim.rdoApplication.AppAplication
│ mBase instance of androidx.appcompat.view.ContextThemeWrapper, not wrapping known Android context
│ ↓ MainActivity.mFragments
├─ androidx.fragment.app.FragmentController instance
│ Leaking: NO (NavHostFragment↓ is not leaking)
│ ↓ FragmentController.mHost
├─ androidx.fragment.app.FragmentActivity$HostCallbacks instance
│ Leaking: NO (NavHostFragment↓ is not leaking)
│ this$0 instance of com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
│ mActivity instance of com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
│ mContext instance of com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
│ ↓ FragmentActivity$HostCallbacks.mFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl instance
│ Leaking: NO (NavHostFragment↓ is not leaking)
│ ↓ FragmentManagerImpl.mPrimaryNav
├─ androidx.navigation.fragment.NavHostFragment instance
│ Leaking: NO (LoginFragment↓ is not leaking and Fragment#mFragmentManager is not null)
│ ↓ NavHostFragment.mChildFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl instance
D/LeakCanary: │ Leaking: NO (LoginFragment↓ is not leaking)
│ ↓ FragmentManagerImpl.mFragmentStore
├─ androidx.fragment.app.FragmentStore instance
│ Leaking: NO (LoginFragment↓ is not leaking)
│ ↓ FragmentStore.mActive
├─ java.util.HashMap instance
│ Leaking: NO (LoginFragment↓ is not leaking)
│ ↓ HashMap.table
├─ java.util.HashMap$Node[] array
│ Leaking: NO (LoginFragment↓ is not leaking)
│ ↓ HashMap$Node[].[0]
├─ java.util.HashMap$Node instance
│ Leaking: NO (LoginFragment↓ is not leaking)
│ ↓ HashMap$Node.value
├─ androidx.fragment.app.FragmentStateManager instance
│ Leaking: NO (LoginFragment↓ is not leaking)
│ ↓ FragmentStateManager.mFragment
├─ com.eim.rdoApplication.ui.fragment.login.LoginFragment instance
│ Leaking: NO (Fragment#mFragmentManager is not null)
│ componentContext instance of dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper,
│ wrapping activity com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
│ ↓ LoginFragment.loadingBg
│ ~~~~~~~~~
├─ androidx.appcompat.widget.AppCompatImageView instance
│ Leaking: UNKNOWN
│ Retaining 2801 bytes in 23 objects
│ View not part of a window view hierarchy
│ View.mAttachInfo is null (view detached)
D/LeakCanary: │ View.mID = R.id.imageView_loading_bg
│ View.mWindowAttachCount = 1
│ mContext instance of dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper, wrapping
│ activity com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
│ ↓ AppCompatImageView.mParent
│ ~~~~~~~
╰→ androidx.constraintlayout.widget.ConstraintLayout instance
Leaking: YES (ObjectWatcher was watching this because com.eim.rdoApplication.ui.fragment.login.LoginFragment
received Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks))
Retaining 3054 bytes in 52 objects
key = 0ab7649b-62de-4b19-a9c6-7c9cf02b88a5
watchDurationMillis = 142488
retainedDurationMillis = 137486
View not part of a window view hierarchy
View.mAttachInfo is null (view detached)
View.mWindowAttachCount = 1
mContext instance of dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper, wrapping
activity com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
Я получил этот отчет, но я не совсем понимаю, как его решить или что я делаю не так
Комментарии:
1. Поделитесь своим xml
Ответ №1:
Я думаю, я выяснил, что вызвало фатальную ошибку. Я установил LeakCanary и получил трассировку выше. После копания в трассировке, из того, что я мог понять, оказалось, что я сохранял ссылку внутри фрагмента A на некоторые представления. Затем, когда я переходил от фрагмента A к следующему фрагменту, я неправильно очищал ссылки на представления. Это было исправлено путем установки значения null для этой ссылки в методе onDestroyView() фрагмента A.