Android आर्किटेक्चर (व्यू) के लिए सुझाव

सिद्धांत और Jetpack Compose को लागू करना

इस पेज पर, आर्किटेक्चर के सबसे सही तरीके और सुझाव दिए गए हैं. इन सिद्धांतों को अपनाकर, अपने ऐप्लिकेशन की क्वालिटी, मज़बूती, और स्केलेबिलिटी को बेहतर बनाएं. इनसे, ऐप्लिकेशन का रखरखाव और उसकी जांच करना भी आसान हो जाता है.

यूज़र इंटरफ़ेस (यूआई) लेयर

यूज़र इंटरफ़ेस (यूआई) लेयर का काम, स्क्रीन पर ऐप्लिकेशन का डेटा दिखाना है. साथ ही, यह उपयोगकर्ता के इंटरैक्शन का मुख्य पॉइंट है. यूज़र इंटरफ़ेस (यूआई) लेयर के लिए, यहां कुछ सबसे सही तरीके दिए गए हैं:

  • आपको रिपॉज़िटरी बनानी चाहिए, भले ही उनमें सिर्फ़ एक डेटा सोर्स हो.
  • छोटे ऐप्लिकेशन में, डेटा लेयर टाइप को data पैकेज या मॉड्यूल में रखा जा सकता है.

सुझाव

ब्यौरा

एक दिशा में डेटा फ़्लो (यूडीएफ़) का पालन करें.

हमारा सुझाव है कि आप इसे भेजें

एकतरफ़ा डेटा फ़्लो (यूडीएफ़) के सिद्धांतों का पालन करें. इसमें ViewModels, ऑब्ज़र्वर पैटर्न का इस्तेमाल करके यूज़र इंटरफ़ेस (यूआई) की स्थिति को दिखाते हैं और मेथड कॉल के ज़रिए यूज़र इंटरफ़ेस (यूआई) से कार्रवाइयां पाते हैं.

अगर आपके ऐप्लिकेशन पर AAC ViewModels के फ़ायदे लागू होते हैं, तो उनका इस्तेमाल करें.

हमारा सुझाव है कि आप इसे भेजें

AAC ViewModels का इस्तेमाल करके, कारोबार के लॉजिक को मैनेज करें. साथ ही, ऐप्लिकेशन का डेटा फ़ेच करके, यूज़र इंटरफ़ेस (यूआई) की स्थिति को यूज़र इंटरफ़ेस (यूआई) पर दिखाएं.

ViewModel से जुड़े सबसे सही तरीके यहां देखें.

ViewModel के फ़ायदे यहां देखें.

लाइफ़साइकल की जानकारी रखने वाले यूज़र इंटरफ़ेस की स्थिति से जुड़ा डेटा इकट्ठा करने की सुविधा का इस्तेमाल करें.

हमारा सुझाव है कि आप इसे भेजें

लाइफ़साइकल के बारे में जानकारी रखने वाले सही को-रूटीन बिल्डर, repeatOnLifecycle का इस्तेमाल करके, यूज़र इंटरफ़ेस (यूआई) से यूज़र इंटरफ़ेस (यूआई) की स्थिति इकट्ठा करें.

repeatOnLifecycle के बारे में ज़्यादा जानें.

ViewModel से यूज़र इंटरफ़ेस (यूआई) को इवेंट न भेजें.

हमारा सुझाव है कि आप इसे भेजें

इवेंट को ViewModel में तुरंत प्रोसेस करें. साथ ही, इवेंट को हैंडल करने के नतीजे के साथ स्थिति को अपडेट करें. यूज़र इंटरफ़ेस (यूआई) इवेंट के बारे में यहां ज़्यादा जानें.

एक गतिविधि वाले ऐप्लिकेशन का इस्तेमाल करें.

सुझाए गए

अगर आपके ऐप्लिकेशन में एक से ज़्यादा स्क्रीन हैं, तो स्क्रीन के बीच नेविगेट करने के लिए नेविगेशन फ़्रैगमेंट का इस्तेमाल करें. साथ ही, अपने ऐप्लिकेशन को डीप लिंक करें.

यहां दिए गए स्निपेट में, लाइफ़साइकल के बारे में जानकारी रखने वाले तरीके से यूज़र इंटरफ़ेस (यूआई) की स्थिति को इकट्ठा करने का तरीका बताया गया है:

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, यूज़र इंटरफ़ेस (यूआई) की स्थिति और डेटा लेयर का ऐक्सेस देने के लिए ज़िम्मेदार होते हैं. यहां ViewModels के लिए कुछ सबसे सही तरीके दिए गए हैं:

सुझाव

ब्यौरा

ViewModels को Android लाइफ़साइकल के बारे में पता नहीं होना चाहिए.

हमारा सुझाव है कि आप इसे भेजें

ViewModels को लाइफ़साइकल से जुड़े किसी भी टाइप का रेफ़रंस नहीं रखना चाहिए. Activity, Fragment, Context या Resources को डिपेंडेंसी के तौर पर पास न करें. अगर ViewModel में किसी Context की ज़रूरत है, तो आपको यह अच्छी तरह से जांच करनी चाहिए कि वह सही लेयर में है या नहीं.

कोरूटीन और फ़्लो का इस्तेमाल करें.

हमारा सुझाव है कि आप इसे भेजें

ViewModel, डेटा या डोमेन लेयर के साथ इन तरीकों से इंटरैक्ट करता है:

  • ऐप्लिकेशन का डेटा पाने के लिए Kotlin फ़्लो,
  • suspend फ़ंक्शन का इस्तेमाल करके, viewModelScope का इस्तेमाल करके कार्रवाइयां की जा सकती हैं.

स्क्रीन लेवल पर ViewModels का इस्तेमाल करें.

हमारा सुझाव है कि आप इसे भेजें

यूज़र इंटरफ़ेस (यूआई) के दोबारा इस्तेमाल किए जा सकने वाले हिस्सों में ViewModels का इस्तेमाल न करें. आपको ViewModels का इस्तेमाल इनमें करना चाहिए:

  • व्यू में ऐक्टिविटी/फ़्रैगमेंट
  • Jetpack Navigation का इस्तेमाल करते समय, डेस्टिनेशन या ग्राफ़.

AndroidViewModel का इस्तेमाल न करें.

हमारा सुझाव है कि आप इसे भेजें

AndroidViewModel के बजाय, ViewModel क्लास का इस्तेमाल करें. ViewModel में Application क्लास का इस्तेमाल नहीं किया जाना चाहिए. इसके बजाय, डिपेंडेंसी को यूज़र इंटरफ़ेस (यूआई) या डेटा लेयर में ले जाएं.

यूज़र इंटरफ़ेस (यूआई) की स्थिति को दिखाना.

सुझाए गए

ViewModels को यूज़र इंटरफ़ेस (यूआई) के लिए डेटा को uiState नाम की एक प्रॉपर्टी के ज़रिए दिखाना चाहिए. अगर यूज़र इंटरफ़ेस (यूआई) में एक से ज़्यादा, काम के न होने वाले डेटा दिखाए जाते हैं, तो ViewModel यूज़र इंटरफ़ेस (यूआई) की एक से ज़्यादा स्टेट प्रॉपर्टी दिखा सकता है.

  • आपको uiState को StateFlow बनाना चाहिए.
  • अगर डेटा, क्रम के अन्य लेयर से डेटा स्ट्रीम के तौर पर आता है, तो आपको uiState को WhileSubscribed(5000) नीति (उदाहरण) के साथ stateIn ऑपरेटर का इस्तेमाल करके बनाना चाहिए.
  • अगर डेटा लेयर से डेटा की कोई स्ट्रीम नहीं आ रही है, तो ऐसे आसान मामलों के लिए, MutableStateFlow को न बदलने वाले StateFlow के तौर पर इस्तेमाल किया जा सकता है.
  • ${Screen}UiState को एक डेटा क्लास के तौर पर इस्तेमाल किया जा सकता है. इसमें डेटा, गड़बड़ियां, और लोडिंग सिग्नल शामिल हो सकते हैं. अगर अलग-अलग स्थितियां एक्सक्लूसिव हैं, तो इस क्लास को सील की गई क्लास के तौर पर भी इस्तेमाल किया जा सकता है.

यहां दिए गए स्निपेट में, ViewModel से यूज़र इंटरफ़ेस (यूआई) की स्थिति को दिखाने का तरीका बताया गया है:

@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
            )

    // ...
}

लाइफ़साइकल

Android लाइफ़साइकल के साथ काम करने के कुछ सबसे सही तरीके यहां दिए गए हैं:

सुझाव

ब्यौरा

गतिविधियों या फ़्रैगमेंट में लाइफ़साइकल के तरीकों को न बदलें.

हमारा सुझाव है कि आप इसे भेजें

ऐक्टिविटी या फ़्रैगमेंट में, लाइफ़साइकल के तरीकों को न बदलें. जैसे, onResume. इसके बजाय, LifecycleObserver का इस्तेमाल करें. अगर ऐप्लिकेशन को लाइफ़साइकल के किसी Lifecycle.State पर पहुंचने के बाद कोई काम करना है, तो repeatOnLifecycle एपीआई का इस्तेमाल करें.

यहां दिए गए स्निपेट में, किसी लाइफ़साइकल की स्थिति के हिसाब से कार्रवाइयां करने का तरीका बताया गया है:

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) {
                // ...
            }
        }
    }
}