خانه » آموزش برنامه نویسی اندروید » Android Architecture و استفاده از LifecycleObserver

Android Architecture و استفاده از LifecycleObserver

زمان هایی پیش میاد که در یک کلاس نیاز داریم تا از Lifecycle با خبر بشیم ، مثلا از onCreate یا onStop و یا onStart و یا حتی، پیش از اجرای برخی متد ها از بودن در state خاصی مثلا بودن در onStart مطمئن بشیم.

در لایبرری Android Architecture که توسط خود گوگل منتشر شده، می تونیم با روش زیر از Lifecycle با خبر بشیم:

 

فرض کنید کلاسی داریم به این شکل :

class MyLocationListener {
    public MyLocationListener(Context context, Callback callback) {
        // ...
    }

    void start() {
        // connect to system location service
    }

    void stop() {
        // disconnect from system location service
    }
}

که کارش اینه که به LocationManager وصل شده و آپدیت های لوکیشن رو بگیره، اما فقط می خوایم زمانی که Activity ما در حالت فعال (OnStart) هست، این کار کنه و زمانی که OnStop شد و Activity کارش تمام شد دیگر آپدیت ها را نگیریم (remove listener)

خوب پیش از این اگر قصد انجام این کار رو داشتیم باید حواسمون بود که در onStart اکتیویتی متد start از این کلاس رو صدا بزنیم و در onStop متد stop را ، اگر زمانی فراموش می کردیم به مشکلات زیادی می خوردیم

حالا میشه این رو به شکل زیر تغییر بدیم:

class MyLocationListener implements LifecycleObserver {

    public MyLocationListener(Context context, Callback callback) {
       ...
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void start() {
        
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void stop() {
        // disconnect if connected
    }
}

تغییری که در کد ایجاد شد این بود که اینترفیس LifecycleObserver  به کلاس اضافه شد و هم اینکه در بالای ۲ متد start و stop ، مقادیر @OnLifecycleEvent(Lifecycle.Event.ON_START)  نوشته شده، که مشخص می کند در onStart یا در onStop این متد صدا زده شود.

خوب حالا برای اینکه این کلاس درست کار کنه فقط یک مرحله مونده، اونم اضافه کردن کد زیر در اکتیویتی هست که قصد دارید از این کلاس در اون استفاده کنید:

MyLocationListener myLocationListener = new MyLocationListener(this,callback)

getLifecycle().addObserver(myLocationListener)

که قسمت مهمش این خط :

getLifecycle().addObserver(myLocationListener)

هست، که به از Activity یا Frgament ما lifecycle رو گرفته و کلاس ما رو به اون اضافه می کنه addObserver(…

دقت کنید که حتما باید کلاس ما اینترفیس LifecycleObserver  را داشته باشد وگرنه متد addObserver ورودی را قبول نمی کند.

 

و نکته از همه مهمتر ، برای استفاده از این قابلیت باید از لایبرری support و appcompatActivity نسخه ۲۷ یا بالاتر استفاده کنید هم چنین باید لایبرری های زیر رو به کد اضافه کنید:

implementation "android.arch.lifecycle:runtime:1.0.3" // not necessary if you are using lifecycle:extensions or lifecycle:common-java8
annotationProcessor "android.arch.lifecycle:compiler:1.0.0" // not needed if you are using the DefaultLifecycleObserver from common-java8 artifact.


// For Lifecycles Java8 Lanaguage support, add:
implementation "android.arch.lifecycle:common-java8:1.0.0"

در صورتی که در نصب مشکل پیش اومد لینک زیر رو هم نگاهی بندازید:

https://developer.android.com/topic/libraries/architecture/adding-components.html

برای اطلاعات بیشتر و کامل تر به لینک زیر مراجعه کنید:

https://developer.android.com/topic/libraries/architecture/lifecycle.html

 

این آموزش هم میتونه به درد بخوره

https://medium.com/exploring-android/exploring-the-new-android-architecture-components-c33b15d89c23

 

 

کد نهایی اکتیویتی :

 

class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    public void onCreate(...) {
	...
        myLocationListener = new MyLocationListener(this,callback)
        getLifecycle().addObserver(myLocationListener)
  }
}
برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا