Versiyon: 1.0 | Guncelleme: 2026-05-22
PostPaid ana sayfa acildiginda stories iki asamada yuklenir: once static stories (ViewModel init), sonra AOM MVA tamamlandiktan sonra dynamic stories. Toplam sure cihaza gore 272ms - 8417ms arasi degisir.
Ozet Sureler:
| Cihaz | Toplam Sure | Static Network | Dynamic Network |
|---|---|---|---|
| Dusuk RAM (Device 1) | 8417ms | 1539ms | 3598ms |
| Orta RAM (Device 3) | 3760ms | 221ms | 911ms |
| Yuksek RAM (Device 2) | 2923ms | 348ms | 226ms |
+----------------------------------------------------+
| Yanimda App |
| |
| +----------------------------------------------+ |
| | PostPaidHomeActivity (UI) | |
| | - setLiveDatas() [LiveData observe] | |
| | - setCategorizedStaticStoriesData() | |
| | - setCategorizedDynamicStoriesData() | |
| | - sortStoriesAndSetList() [sort + render] | |
| | - rvStories RecyclerView (Horizontal) | |
| | - categorizedStoriesAdapter | |
| +------------------+---------------------------+ |
| v |
| +----------------------------------------------+ |
| | PostPaidHomeViewModel | |
| | - getCategorizedStaticStories() [init] | |
| | - getCategorizedDynamicStories() [post-AOM] | |
| | - homeCategorizedStaticStoriesLiveData | |
| | - homeCategorizedDynamicStoriesLiveData | |
| | - isAomMvaSent (gate for dynamic stories) | |
| +------------------+---------------------------+ |
| v |
| +----------------------------------------------+ |
| | CommonRepository | |
| | - responseFlowWrapper { rds.call() } | |
| +------------------+---------------------------+ |
| v |
| +----------------------------------------------+ |
| | CommonRemoteDataSource | |
| | - getCategorizedStaticStories() [GET] | |
| | - getCategorizedDynamicStories() [POST] | |
| | - BaseRemoteDataSource.getResponse() | |
| +------------------+---------------------------+ |
| v |
| +---------------------+ |
| | REST API Server | |
| +---------------------+ |
+----------------------------------------------------+
getCategorizedStaticStories() cagirilirviewModelScope.launch(Dispatchers.IO) ile IO thread'de calisirhomeCategorizedStaticStoriesLiveData ile postValue yapilirsetLiveDatas() icinde homeCategorizedStaticStoriesLiveData.observeNonNull dinlenirsetCategorizedStaticStoriesData() cagirilirbinding.rvStories.hideShimmerAdapter() — shimmer kaldirilircategorizedStories.addAll(categoryList) — static list eklenirsortStoriesAndSetList() cagirilir → kullanici ilk kez stories gorebilirdynamicStories() metodu isAomMvaSent LiveData'yi observer ederisAomMvaSent = true olurdelay(getStoryDelay()) — config-based delay uygulanir (default: delaySn * 1000ms)PostPreCommonUtils.checkTargetStoryResponse() — target story verisi kontrol edilirgetCategorizedDynamicStories(invoiceInfo, addonInfo, targetList) tetiklenirsetCategorizedDynamicStoriesData() cagirilirsortStoriesAndSetList() tekrar cagirilir → kullanici final stories gorebilirBu fonksiyon her iki fazda da calisir:
| Kriter | Puan | Aciklama |
|---|---|---|
| anyLockedType | 32 | Kilitli icerikler en uste |
| countdown | 16 | Geri sayimli hikayeler |
| pinned | 8 | Sabitlenmis hikayeler |
| featured | 4 | One cikan hikayeler |
| !isShown | 2 | Gorulmemis hikayeler |
| priority | ±1 | Priority degeri tiebreaker |
adapter.setList() + notifyDataSetChanged()rvStories.post {} ile RecyclerView layout pass tamamlaninca sure olculur| # | API | Metod | Tetikleyici | Thread | Bagimlilik |
|---|---|---|---|---|---|
| 1 | getCategorizedStaticStories | GET | ViewModel init | Dispatchers.IO | Yok — aninda baslar |
| 2 | getCategorizedDynamicStories (V2) | POST | AOM MVA response + delay | Dispatchers.IO | isAomMvaSent = true |
getCategorizedStaticStories:
restadapterEndpointSecure/api?method=getCategorizedStaticStoriessid (session ID)GetCategorizedStoryResponse (categoryList: ListgetCategorizedDynamicStories:
restadapterEndpointSecure/api?method=getCategorizedDynamicStoriesV2sid, invoiceInfo, addonInfoTargetList (JSON POST)Content-Type: application/json, Accept: application/jsonGetCategorizedStoryResponse (categoryList: List0ms 1539ms 1740ms 2138ms 4684ms 8282ms 8287ms 8417ms
| | | | | | | |
Init Static Sort Render Dynamic Dyn Sort Render
Resp Start Done Call Resp Start Done
| Metric | Sure |
|---|---|
| getCategorizedStaticStories | 1539ms |
| Data processing (response → render start) | 201ms |
| Stories render (static) | 399ms |
| Gap (static done → dynamic call) | 2546ms |
| getCategorizedDynamicStories | 3598ms |
| Data processing (response → render start) | 5ms |
| Stories render (dynamic) | 130ms |
| Toplam (first visible to final) | 8417ms |
0ms 348ms 369ms 427ms 2669ms 2895ms 2912ms 2923ms
| | | | | | | |
Init Static Sort Render Dyn Dyn Sort Render
Resp Start Done Call Resp Start Done
| Metric | Sure |
|---|---|
| getCategorizedStaticStories | 348ms |
| Data processing (response → render start) | 21ms |
| Stories render (static) | 58ms |
| Gap (static done → dynamic call) | 2242ms |
| getCategorizedDynamicStories | 226ms |
| Data processing (response → render start) | 17ms |
| Stories render (dynamic) | 11ms |
| Toplam (first visible to final) | 2923ms |
0ms 221ms 238ms 272ms 2824ms 3735ms 3736ms 3760ms
| | | | | | | |
Init Static Sort Render Dyn Dyn Sort Render
Resp Start Done Call Resp Start Done
| Metric | Sure |
|---|---|
| getCategorizedStaticStories | 221ms |
| Data processing (response → render start) | 17ms |
| Stories render (static) | 34ms |
| Gap (static done → dynamic call) | 2552ms |
| getCategorizedDynamicStories | 911ms |
| Data processing (response → render start) | 1ms |
| Stories render (dynamic) | 24ms |
| Toplam (first visible to final) | 3760ms |
| Metric | Dusuk RAM | Orta RAM | Yuksek RAM |
|---|---|---|---|
| Static network | 1539ms | 221ms | 348ms |
| Static render | 399ms | 34ms | 58ms |
| Gap (AOM wait) | 2546ms | 2552ms | 2242ms |
| Dynamic network | 3598ms | 911ms | 226ms |
| Dynamic render | 130ms | 24ms | 11ms |
| Toplam | 8417ms | 3760ms | 2923ms |
| Static items | 13 | 12 | 14 |
| Final items | 14 | 14 | 16 |
Performans loglarinin yerlestirilme noktalari:
| Log | Dosya | Satir | Thread |
|---|---|---|---|
getCategorizedStaticStories: Request |
PostPaidHomeViewModel.kt | 379 | IO |
getCategorizedStaticStories: Response |
PostPaidHomeViewModel.kt | 392 | IO |
getCategorizedDynamicStories: Request |
PostPaidHomeViewModel.kt | 462 | IO |
getCategorizedDynamicStories: Response |
PostPaidHomeViewModel.kt | 475 | IO |
Stories render started at: |
PostPaidHomeActivity.kt | 1585 | Main |
Stories render finished at: |
PostPaidHomeActivity.kt | 1635 | Main |
Stories render duration: |
PostPaidHomeActivity.kt | 1636 | Main |
ViewModel init (Main Thread)
|
+---> viewModelScope.launch(Dispatchers.IO)
| |
| +---> CommonRepository.getCategorizedStaticStories()
| +---> CommonRemoteDataSource.getCategorizedStaticStories() [Network I/O]
| +---> homeCategorizedStaticStoriesLiveData.postValue() [thread-safe bridge to Main]
|
+---> Main Thread: LiveData observer fires
|
+---> setCategorizedStaticStoriesData() [Main Thread]
+---> sortStoriesAndSetList() [Main Thread]
|
+---> PreferenceHelper.isStoryIdShown() [SharedPreferences read - Main Thread]
+---> categorizedStories.sortWith() [CPU sort - Main Thread]
+---> adapter.setList() + notifyDataSetChanged() [Main Thread]
+---> rvStories.post {} → measure render done [Main Thread, after layout]
Activity (Main Thread)
|
+---> isAomMvaSent observer fires
+---> lifecycleScope.launch(Dispatchers.Main)
| +---> delay(getStoryDelay()) [Main Thread suspend]
| +---> getCategorizedDynamicStories() → same IO flow as static
Potansiyel sorun: sortStoriesAndSetList() tamamen Main Thread'de calisir — siralama, SharedPreferences okuma ve RecyclerView guncelleme hepsi Main Thread'de.
| Timer/Delay | Sure | Kaynak | Amac |
|---|---|---|---|
| AOM MVA wait | ~2000-4700ms | isAomMvaSent observer | Dynamic stories AOM'dan sonra tetiklenir |
| getStoryDelay() | delaySn * 1000ms | ConfigManager.homeAdobeTargetStoryDelay | UI settle / target delay |
| STORY_DEFAULT_DELAY | Fallback | PostPreCommonUtils | Config null ise default |
| rvStories.post {} | 1 frame | Android View system | Layout pass tamamlanma olcumu |
| Shimmer | API response'a kadar | showShimmerAdapter() | Kullanici beklerken placeholder |
with(binding.rvStories) {
layoutManager = LinearLayoutManager(context, HORIZONTAL, false)
isNestedScrollingEnabled = false
adapter = categorizedStoriesAdapter
setHasFixedSize(true)
setItemViewCacheSize(20)
isDrawingCacheEnabled = true
showShimmerAdapter() // Shimmer gosterilir ta ki API response gelene kadar
}
| Config | Deger | Etki |
|---|---|---|
| Direction | HORIZONTAL | Yatay kaydirma |
| NestedScrolling | false | Scroll performansi |
| HasFixedSize | true | Layout optimizasyonu |
| ItemViewCacheSize | 20 | Extra cache (default 2) |
| DrawingCache | true | Drawing cache aktif |
ViewModel Init → Static API (1539ms) → Sort+Render (399ms) → AOM Wait (2546ms) → Dynamic API (3598ms) → Sort+Render (130ms)
Toplam: 8417ms
ViewModel Init → Static API (348ms) → Sort+Render (58ms) → AOM Wait (2242ms) → Dynamic API (226ms) → Sort+Render (11ms)
Toplam: 2923ms
| Rank | Bottleneck | Etki | Oran |
|---|---|---|---|
| 1 | AOM MVA wait gap | ~2200-2550ms tum cihazlarda | %30-60 of total |
| 2 | Dynamic stories network | 226-3598ms (cihaza bagli) | %8-43 of total |
| 3 | Static stories network | 221-1539ms (cihaza bagli) | %7-18 of total |
| 4 | Static render | 34-399ms (cihaza bagli) | %1-5 of total |
| 5 | Dynamic render | 11-130ms (cihaza bagli) | <2% of total |
AOM bagimlilik en buyuk bottleneck: Dynamic stories AOM MVA response'a bagimli. Bu ~2.2-2.5s'lik sabit bir gap olusturuyor — network veya render optimizasyonundan bagimsiz.
Render performansi iyi: Ikinci render (dynamic) her zaman ilk renderdan hizli — RecyclerView cache calisiyror (399ms → 130ms, 58ms → 11ms, 34ms → 24ms).
Dusuk RAM farki dramatik: Static network 7x yavaş (221ms vs 1539ms), dynamic network 16x yavaş (226ms vs 3598ms).
sortStoriesAndSetList() Main Thread riski: Siralama + SharedPreferences okuma + RecyclerView guncelleme hepsi Main Thread'de. Dusuk RAM cihazlarda 399ms render suresi bunu dogruluyor.
notifyDataSetChanged() kullanimi: Tum liste yeniden render ediliyor — DiffUtil kullanilmiyor. Dynamic stories geldiginde sadece yeni eklenen items render edilebilir.
Gap tutarliligi: AOM wait gap (2242-2552ms) tum cihazlarda benzer — bu network/cihaz degil, AOM pipeline'in kendi suresi.
ViewModel Init
|
+---> getCategorizedStaticStories() ----response---+
| |
| setCategorizedStaticStoriesData() <-----------+
| |
| +---> sortStoriesAndSetList() → STATIC STORIES VISIBLE
|
+---> AOM MVA pipeline (paralel)
|
+---> isAomMvaSent = true
|
+---> delay(getStoryDelay())
|
+---> getCategorizedDynamicStories() ----response---+
|
setCategorizedDynamicStoriesData() <----------+
|
+---> merge static + dynamic
+---> sortStoriesAndSetList() → FINAL STORIES VISIBLE