نحوه استفاده از LiveData با Architecture Components: Data Binding

شنبه ۱۵ اردیبهشت ۹۷ توسط یوسف رضا مختاری

سلام! همان طور که میدانید , در جدیدترین نسخه Android Studio گوگل پشتیبانی برای LiveData را با Data Binding معرفی کرده است  .

امروز من می خواهم به طور خلاصه نشان دهم چگونه از آن در پروژه خود استفاده کنید. بیایید شروع کنیم!

برخی از شما ممکن است این topic را دیده باشید، جایی که Yigit Boyar(یکی از کارکنان و مهندس نرم افزار در گوگل) وعده داده است به افزودن پشتیبانی از LiveData  با استفاده از Data Binding :

و یک خبر خوش در اینجا با جدیدترین نسخه  Android Studio 3.1 Canary 6  این کار امکان پذیر می باشد.

این نسخه شامل تغییر در Data Binding می باشد که به شما اجازه می دهد ObservableField را با LiveData در عبارات data binding جایگزین کنید .

در این جا ما یک آموزش گام به گام در مورد نحوه عملکرد آن داریم . شما همچنین می توانید کل کد این پست را در اینجا چک کنید.

راه اندازی

شما برای استفاده از این قابلیت باید چه کاری انجام دهید؟

در ابتدا، شما نیاز دارید جدیدترین نسخه Android Studio دریافت کنید . سپس نیاز دارید نسخه پلاگین Gradle اندروید خود را upgrade کنید .         

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.0-alpha06'
    }
}

اگر از Kotlin استفاده می کنید، شما همچنین باید نسخه کامپایلر  databinding را تغییر دهید.

kapt 'com.android.databinding:compiler:3.1.0-alpha06'

همین .حالا شما آماده هستید تا شروع کنید.

چگونه از آن استفاده کنید؟

حالا شما میتوانید تمام ObservableField خود را با کلاس های LiveData جایگزین کنید.

که پیش از این بود:

val kittyName = ObservableField<String>()
val kittyAge = ObservableInt()

init {
    kittyRepository.receiveNewKitties {
        kittyName.set(it.name)
        kittyAge.set(it.age)
    }
}

و بعد از این:

val kittyName = MutableLiveData<String>()
val kittyAge = MutableLiveData<Int>()

init {
    kittyRepository.receiveNewKitties {
        kittyName.postValue(it.name)
        kittyAge.postValue(it.age)
    }
}

برای این کار ما هم چنین نیاز داریم کلاس binding که LifecycleOwner می باشد را تعریف کنیم . پس میتواند lifecycle را به درستی دنبال کند.

val binding: ActivityMainBinding = ...
binding.setLifecycleOwner(this)

خوب، اما چه تغییری می کند؟

شما میتوانید در مورد LiveData در پست قبلی بیشتر بخوانید . به طور کلی، با LiveData ما نیازی به نگرانی در مورد lifecycle نداریم.

داده ها فقط زمانی که active می شود به UI فرستاده می شود.

در رویکرد قبلی (بدون LiveData) اگر ما می خواستیم داده ها را در UI نمایش دهیم، ما باید قبلا بررسی میکردیم که آیا هنوز دیتا وجود دارد.

با LiveData ما لازم نیست که در مورد آن نگران باشیم چون داده ها  تنها اگر Activity در حالت آغاز شده باشد(در وضعیت started یا resumed) ارسال می شوند .

برای مثال ، می توانیم  log هایی هم برای تولید داده تنظیم کنیم (به عنوان مثال در بلوک ()init از کلاس MainViewModel)

init {
    kittyRepository.receiveNewKitties {
        Log.d("MainViewModel", "Generating kitty name: " + it.name)
        ...
    }
}

و دومین log هم برای بروزرسانی دیتا UI (به عنوان مثال TextWatcher در کلاس MainActivity)

kittyNameText.addAfterTextChangedListener { Log.d("MainActivity",
    "Showing kitty name: " + it) }

حالا، اگر برنامه را بدون LiveData در background قرار دهیم، می بینیم:

D/MainViewModel: Generating kitty name: TIGER
D/MainActivity: Showing kitty name: TIGER
D/MainViewModel: Generating kitty name: FLUFFY
D/MainActivity: Showing kitty name: FLUFFY

این یعنی که UI آپدیت می شود حتی بعد از اینکه activity متوقف شده(paused) .این کار غیر ضروری است . و این جایی است که LiveData از ما مراقبت می کند .

حالا اگر برنامه را با LiveData  اجرا کنیم و در background قرار دهیم , می بینیم :

D/MainViewModel: Generating kitty name: PUMPKIN
D/MainViewModel: Generating kitty name: TIGER

داده ها تولید می شوند، اما UI آپدیت نمی شود، زیرا activity در وضعیت شروع (started) یا از سر گرفته(resumed) نمی باشد. عالی!

 

امیدوارم این مطلب برای شما مفید بوده باشد.

 
 
 
 
 
 

کلیدواژه: آموزش برنامه نویسی اندروید Android Architecture Components نحوه استفاده از LiveData با Data Binding معرفی LiveData Data Binding در LiveData

منابع: android.jlelse.eu

ارسال دیدگاه:
برای ارسال دیگاه باید به سیستم وارد شوید و یا ثبت نام کنید. ثبت نام چند لحظه بیشتر زمان شما را نمیگیرد.