I have enabled performance monitoring by adding Firebase performance SDK to my apps. But I am getting high percentage of Frozen Frames and Slow rendering. Most of the screens have recycler views in it which get the data from APIs and populate the views.
I want to reduce my Frozen frame rates to around 1 to 5%. Any suggestions would be higly appreciated.
Note: I changed the layout structure from Linear/Relative to ConstraintLayout which reduced the rate by appx. 2+%.
Here is a snippet of one of my activities:
HomeActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
(application as App).getAdUtilInstance()?.let { setupViewPager(it) }
drawerIv.setOnClickListener {
startActivity(Intent(this@HomeActivity,
MenuActivity::class.java))
}
searchIv.setOnClickListener {
startActivity(Intent(this@HomeActivity,
SearchActivity::class.java))
}
loadExitAd()
val clevertapDefaultInstance =
CleverTapAPI.getDefaultInstance(applicationContext)
clevertapDefaultInstance.setInAppNotificationButtonListener(this)
checkForNotifications()
if (intent.hasExtra("TAB")) {
val tabNumber: Int = intent.getIntExtra("TAB", 0)
setCurrentItem(tabNumber)
}
}
private fun setupViewPager(adUtility: AdUtility) {
tab_bar.setOnTabClickedListener(OnTabClickedListener { view, pos ->
when (pos) {
0 -> {
if (homeConstraintGroup.visibility == View.GONE) {
showToolbar()
}
viewPager.currentItem = 0
val bundle = Bundle()
bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.HOME)
AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)
val ctBundle = Bundle()
ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.HOME)
AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
}
1 -> {
Log.d("123__", "Movies")
if (homeConstraintGroup.visibility == View.GONE) {
showToolbar()
}
viewPager.currentItem = 1
val bundle = Bundle()
bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.MOVIES)
AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)
val ctBundle = Bundle()
ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.MOVIES)
AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
}
2 -> {
Log.d("123__", "Tv shows")
if (homeConstraintGroup.visibility == View.GONE) {
showToolbar()
}
viewPager.currentItem = 2
val bundle = Bundle()
bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.TV_SHOWS)
AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)
val ctBundle = Bundle()
ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.TV_SHOWS)
AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
}
3 -> {
Log.d("123__", "Ott")
hideToolbar()
viewPager.currentItem = 3
val bundle = Bundle()
bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.OTT)
AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)
val ctBundle = Bundle()
ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.OTT)
AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
}
5 -> {
Log.d("123__", "Music")
if (homeConstraintGroup.visibility == View.GONE) {
showToolbar()
}
viewPager.currentItem = 4
val bundle = Bundle()
bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.MUSIC)
AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)
val ctBundle = Bundle()
ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.MUSIC)
AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
}
6 -> {
Log.d("123__", "News")
if (homeConstraintGroup.visibility == View.GONE) {
showToolbar()
}
viewPager.currentItem = 5
val bundle = Bundle()
bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.NEWS)
AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)
val ctBundle = Bundle()
ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.NEWS)
AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
}
7 -> {
Log.d("123__", "Lifestyle")
if (homeConstraintGroup.visibility == View.GONE) {
showToolbar()
}
viewPager.currentItem = 6
val bundle = Bundle()
bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.LIFESTYLE)
AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)
val ctBundle = Bundle()
ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.LIFESTYLE)
AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
}
8 -> {
Log.d("123__", "Sports")
if (homeConstraintGroup.visibility == View.GONE) {
showToolbar()
}
viewPager.currentItem = 7
val bundle = Bundle()
bundle.putString(FirebasePropertyConstants.ROUTE, FirebaseValueConstants.SPORTS)
AnalyticsManager.logEvent(FirebaseEventConstants.TOP_BAR, bundle, true)
val ctBundle = Bundle()
ctBundle.putString(CTnFBPropertyConstants.PAGE_VIEW, CTnFBValueConstants.SPORTS)
AnalyticsManager.logEvent(CTnFBEventConstants.NAVI, ctBundle, false)
}
}
})
viewPager.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
}
override fun onPageScrollStateChanged(state: Int) {}
})
val adapter = ViewPagerAdapter(supportFragmentManager)
homeFragment = HomeFragment()
moviesFragment = MoviesFragment()
tvShowsFragment = TvShowsFragment()
ottFragment = OttFragment()
newsFragment = NewsFragment()
musicFragment = MusicFragment()
sportsFragment = SportsFragment()
lifestyleFragment = LifestyleFragment()
adapter.addFragment(homeFragment)
adapter.addFragment(moviesFragment)
adapter.addFragment(tvShowsFragment)
adapter.addFragment(ottFragment)
adapter.addFragment(musicFragment)
adapter.addFragment(newsFragment)
adapter.addFragment(lifestyleFragment)
adapter.addFragment(sportsFragment)
viewPager.adapter = adapter
}
activity_home.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/home_screen_background">
<androidx.constraintlayout.widget.Group
android:id="@+id/homeConstraintGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
app:constraint_referenced_ids="appLogo, appNameLogo, searchIv, drawerIv" />
<ImageView
android:id="@+id/appLogo"
android:layout_gravity="center_vertical"
android:src="@drawable/livetv_logo_small"
android:padding="10dp"
android:layout_marginEnd="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="50dp"
android:layout_height="50dp"/>
<ImageView
android:id="@+id/appNameLogo"
android:layout_gravity="center_vertical"
android:src="@drawable/livetv_text_logo"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/appLogo"
android:layout_marginEnd="5dp"
android:layout_marginTop="3dp"
android:layout_width="50dp"
android:layout_height="50dp"/>
<ImageView
android:id="@+id/searchIv"
android:layout_centerVertical="true"
android:src="@drawable/search"
android:padding="15dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@+id/drawerIv"
android:layout_marginEnd="5dp"
android:layout_width="50dp"
android:layout_height="50dp"/>
<ImageView
android:id="@+id/drawerIv"
android:layout_centerVertical="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/menu"
android:padding="15dp"
android:layout_width="50dp"
android:layout_height="50dp"/>
<com.vk.dev.android.ExpandableBottomTabBar
android:id="@+id/tab_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:background="@color/home_screen_background"
app:max_tab_count="5"
android:textSize="10sp"
android:textColor="#9E9D99"
app:selected_tab_text_color="@color/colorPrimary"
app:itemIconTint="@drawable/bottom_selector"
app:itemTextColor="@drawable/bottom_selector"
app:labelVisibilityMode="labeled"
app:tab_resource="@xml/bottombar_tabs"
app:more_icon_resource="@drawable/menu_inactive"
/>
<com.livetv.freelivetv.movies.helpers.NonSwipeableViewPager
android:id="@+id/viewPager"
android:layout_above="@id/tab_bar"
app:layout_constraintTop_toBottomOf="@+id/appLogo"
app:layout_constraintBottom_toTopOf="@+id/tab_bar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="0dp"
android:layout_height="0dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Below is the screenshot showing their respective percentages on various screens.
