Android mimarisiyle ilgili öneriler (Görünümler)

Kavramlar ve Jetpack Compose uygulaması

Bu sayfada, mimariyle ilgili çeşitli en iyi uygulamalar ve öneriler sunulmaktadır. Uygulamanızın kalitesini, sağlamlığını ve ölçeklenebilirliğini artırmak için bu uygulamaları benimseyin. Ayrıca uygulamanızın bakımını ve testini de kolaylaştırır.

Kullanıcı arayüzü katmanı

Kullanıcı arayüzü katmanının rolü, uygulama verilerini ekranda göstermek ve kullanıcının etkileşim kurduğu birincil nokta olarak hizmet vermektir. Kullanıcı arayüzü katmanıyla ilgili bazı en iyi uygulamalar:

  • Yalnızca tek bir veri kaynağı içerseler bile depolar oluşturmanız gerekir.
  • Küçük uygulamalarda, veri katmanı türlerini bir data paket veya modüle yerleştirmeyi seçebilirsiniz.

Öneri

Açıklama

Tek Yönlü Veri Akışı (UDF)'nı izleyin.

Önerilen çözümler

Tek Yönlü Veri Akışı (UDF) ilkelerini uygulayın. Bu ilkelerde, ViewModel'ler gözlemci kalıbını kullanarak kullanıcı arayüzü durumunu gösterir ve yöntem çağrıları aracılığıyla kullanıcı arayüzünden işlemleri alır.

Avantajları uygulamanız için geçerliyse AAC ViewModels'i kullanın.

Önerilen çözümler

İş mantığını işlemek ve kullanıcı arayüzü durumunu kullanıcı arayüzüne göstermek için uygulama verilerini getirmek üzere AAC ViewModels'i kullanın.

Diğer ViewModel en iyi uygulamalarını burada bulabilirsiniz.

ViewModel'lerin avantajlarını buradan inceleyebilirsiniz.

Yaşam döngüsüne duyarlı kullanıcı arayüzü durumu toplama özelliğini kullanın.

Önerilen çözümler

Uygun yaşam döngüsü farkında olan eş yordam oluşturucuyu (repeatOnLifecycle) kullanarak kullanıcı arayüzünden kullanıcı arayüzü durumunu toplayın.

repeatOnLifecycle hakkında daha fazla bilgi edinin.

ViewModel'den kullanıcı arayüzüne etkinlik göndermeyin.

Önerilen çözümler

Etkinliği ViewModel'de hemen işleyin ve etkinliğin işlenmesi sonucunda bir durum güncellemesi gerçekleştirin. Kullanıcı arayüzü etkinlikleri hakkında daha fazla bilgiyi burada bulabilirsiniz.

Tek etkinlikli bir uygulama kullanın.

Önerilen

Uygulamanızda birden fazla ekran varsa ekranlar arasında gezinmek ve uygulamanıza derin bağlantı oluşturmak için Navigation Fragments'ı kullanın.

Aşağıdaki snippet'te, kullanıcı arayüzü durumunun yaşam döngüsünden haberdar bir şekilde nasıl toplanacağı özetlenmektedir:

class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModel()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewLifecycleOwner.lifecycleScope.launch {
            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
                viewModel.uiState.collect {
                    // Process item
                }
            }
        }
    }
}

ViewModel

ViewModels, kullanıcı arayüzü durumunu sağlamaktan ve veri katmanına erişimden sorumludur. ViewModel'lerle ilgili en iyi uygulamalardan bazıları şunlardır:

Öneri

Açıklama

ViewModel'lar Android yaşam döngüsünden bağımsız olmalıdır.

Önerilen çözümler

ViewModel'ler, yaşam döngüsüyle ilgili herhangi bir türe referans tutmamalıdır. Activity, Fragment, Context veya Resources'ı bağımlılık olarak iletmeyin. ViewModel'de Context gerektiren bir durum varsa bunun doğru katmanda olup olmadığını dikkatlice değerlendirmeniz gerekir.

Coroutine'ları ve akışları kullanın.

Önerilen çözümler

ViewModel, aşağıdaki yöntemleri kullanarak veri veya alan katmanlarıyla etkileşimde bulunur:

  • Uygulama verilerini almak için Kotlin akışları,
  • viewModelScope kullanarak işlem yapmak için suspend işlevleri.

ViewModel'leri ekran düzeyinde kullanın.

Önerilen çözümler

ViewModel'leri yeniden kullanılabilir arayüz parçalarında kullanmayın. ViewModel'leri şu durumlarda kullanmalısınız:

  • Görünümlerdeki Etkinlikler/Parçalar
  • Jetpack Navigation kullanılırken hedefler veya grafikler.

AndroidViewModel kullanmayın.

Önerilen çözümler

AndroidViewModel değil, ViewModel sınıfını kullanın. Application sınıfı ViewModel'de kullanılmamalıdır. Bunun yerine, bağımlılığı kullanıcı arayüzüne veya veri katmanına taşıyın.

Bir kullanıcı arayüzü durumunu kullanıma sunma.

Önerilen

ViewModels, verileri uiState adlı tek bir özellik aracılığıyla kullanıcı arayüzüne sunmalıdır. Kullanıcı arayüzünde birden fazla, birbiriyle ilişkisiz veri gösteriliyorsa ViewModel birden fazla kullanıcı arayüzü durumu özelliği kullanıma sunabilir.

  • uiState adlı dosyayı StateFlow yapmalısınız.
  • Veriler, hiyerarşinin diğer katmanlarından veri akışı olarak geliyorsa uiState politikasını stateIn operatörüyle birlikte kullanarak WhileSubscribed(5000) oluşturmalısınız (örnek).
  • Veri katmanından gelen veri akışlarının olmadığı daha basit durumlarda MutableStateFlow olarak sunulan StateFlow kullanmak kabul edilebilir.
  • ${Screen}UiState öğesini veri, hata ve yükleme sinyalleri içerebilen bir veri sınıfı olarak kullanmayı seçebilirsiniz. Farklı durumlar özel ise bu sınıf kapalı sınıf da olabilir.

Aşağıdaki snippet'te, ViewModel'den kullanıcı arayüzü durumunun nasıl kullanıma sunulacağı özetlenmektedir:

@HiltViewModel
class BookmarksViewModel @Inject constructor(
    newsRepository: NewsRepository
) : ViewModel() {

    val feedState: StateFlow<NewsFeedUiState> =
        newsRepository
            .getNewsResourcesStream()
            .mapToFeedState(savedNewsResourcesState)
            .stateIn(
                scope = viewModelScope,
                started = SharingStarted.WhileSubscribed(5_000),
                initialValue = NewsFeedUiState.Loading
            )

    // ...
}

Yaşam döngüsü

Android yaşam döngüsüyle çalışırken dikkat etmeniz gereken bazı en iyi uygulamaları aşağıda bulabilirsiniz:

Öneri

Açıklama

Etkinliklerde veya parçalarda yaşam döngüsü yöntemlerini geçersiz kılmayın.

Önerilen çözümler

Etkinliklerde veya parçalarda onResume gibi yaşam döngüsü yöntemlerini geçersiz kılmayın. Bunun yerine LifecycleObserver kullanın. Uygulamanın yaşam döngüsü belirli bir Lifecycle.State'ya ulaştığında işlem yapması gerekiyorsa repeatOnLifecycle API'sini kullanın.

Aşağıdaki snippet'te, belirli bir yaşam döngüsü durumu verildiğinde işlemlerin nasıl gerçekleştirileceği özetlenmektedir:

class MyFragment: Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onResume(owner: LifecycleOwner) {
                // ...
            }
            override fun onPause(owner: LifecycleOwner) {
                // ...
            }
        }
    }
}