انجام عملیات مرتبط با زمان در اندروید

منتشرشده توسط حامد قنبری در تاریخ

مواقعی وجود دارد که می خواهیم عمیاتی در مدت زمان مشخصی بعد از یک رویداد خاص اجرا شود یا در برخی این ضرورت نمایان می شود که بخواهیم عملیاتی در طول برنامه بطور مداوم در طول مدت زمان مشخصی اجرا شود.تکرار دوره ای عملیات ها در یک برنامه یک نیاز اساسی و مشترک  بین  برنامه نویسان است. این قابلیت را می توان برای نمونه برداری از داده های جدید در شبکه، اجرای انیمیشن های دستی و یا به منظور بروز رسانی رابط کاربر یا UI استفاده کرد. حداقل چهار راه برای اجرای  عملیات های دوره ای وجود دارد:

Handler :

اگر شما نیاز دارید که UI اصلی را با یک موضوع  دیگر به روز کنید، باید آن را با موضوع اصلی UI همگام سازی کنید. به دلیل این محدودیت ها و پیچیدگی ها، آندروید کلاس های ساخته شده Handler را ارائه می دهد.یک Handler اجازه ارتباط با موضوع UI را از موضوع دیگر می دهد. چرا که آندروید اجازه نمی دهد که موضوعات دیگر به طور مستقیم با موضوع UI ارتباط برقرار کنند. نقش Handler  در اینجا نیز ارتباط با UI  و همگام سازی آن با موضوع مورد نظر ماست  (اعمال عملیات های زمانی ) است . پس یک  عملیات قابل جرا در UIThread  یا ترد اصلی بوسیله Handler   قابل مدیریت(مدیریت زمانی) می باشد.(برای آموزش نحوه بکارگیری این مدل اینجا کلیک کنید)

  final Handler handler = new Handler();
        Runnable runnableCode = new Runnable() {
            @Override
            public void run() {


                // your cod
              
              
                handler.postDelayed(this, 2000);
            }
        };

        handler.post(runnableCode);

که به منظور توقف چنین دستوری می توانیم از کد زیر استفاده کنیم :

handler.removeCallbacks(runnableCode);

ScheduledThreadPoolExecutor –  عملیات دوره ای را در پس زمینه انجام می دهد.

گاهی اوقات ما نیاز به انجام یک عملیات به صورت دوره ای داریم یا می خواهیم پس از تاخیر  زمانی مشخصی عملیات خاصی توسط برنامه انجام پذیرد. اگر چه جاوا کلاس Timer را به این منظور معرفی کرده است که از طریق آن  می توانیم این کار را بسهولت انجام دهیم اما  باید توجه داشت که انجام عملیات های موازی عملا با این روش جوابگوی نیازهای ما نخواهد بود و فلذا ایجاد آبجکت های چندگانه تایمر، موجب اخلال در اجرای سیستم و پایین آمدن کارایی برنامه های ما خواهد شد. از این رو   بهتر است که از threadمجزا  برای انجام کارهای برنامه ریزی شده خود بهره بگیریم.

جاوا برنامه پیاده سازی thread scheduled را از طریق کلاس ScheduledThreadPoolExecutor اجرا می کند که رابط ScheduledExecutorService می باشد .  ScheduledExecutorService نیز به نوبه خود روش های قراردادی ما را  برای برنامه ریزی یک عملیات با گزینه های مختلف امکانپذیر می سازد.

 

در واقع این روش مطلوب نظر کسانی خواهد بود که بخواهند عملیات های زمانی متعددی را بصورت  موازی در پس زمینه انجام دهند. در زیر نحوه استفاده از این کلاس را برایتان آماده کرده ایم.

public class MainActivity extends Activity {

    private ScheduledExecutorService scheduleTaskExecutor;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        scheduleTaskExecutor= Executors.newScheduledThreadPool(5);
        // This schedule a task to run every 10 minutes:
        scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
            public void run() {
                // If you need update UI, simply do this:
                runOnUiThread(new Runnable() {
                    public void run() {


                    }
                });
            }
        }, 0, 10, TimeUnit.MINUTES);
    } // end of onCreate()

}

AlarmManager – هر گونه عملیات دوره ای در پس زمینه به عنوان یک سرویس را انجام می دهد.(برای آموزش این روش اینجا کلیک کنید)

بطور کلی با این کلاس می توان :

عملیات مشخصی در زمان مشخصی انجام داد.
عملیات مشخصی در زمان مشخصی انجام شود و سپس در بازه های خاص تکرار شود.

همانطور که در لینک آموزشی معرفی شده مطرح گردید .این کلاس از سرویس های سیستمی اندروید می باشد که بطور منظم و براساس تایم دیوایس کار می کند. و لازم است سرویسی برای برنامه تعریف شود تا بر اساس آن سرویس AlarmManager عملکرد خود را نشان دهد در مثال زیر آن سرویس کلاس MyReceiver است. با توجه به آنچه گفته شد می توان از این کلاس به منظور اهداف متعددی استفاده نمود.

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 30);

long time = cal.getTimeInMillis();

Intent i = new Intent(MainActivity.this, MyReceiver.class);

PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, i, 0);

// am.set(AlarmManager.RTC_WAKEUP,time,pi);

alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, 5 * 1000, pi);

لازم به ذکر است علی رغم جذابیتی که در استفاده از این کلاس وجود دارد باید توجه نمود که در صورت امکان باید تا حد ممکن، از استفاده بی مورد از این کلاس خودداری کرد چراکه وجود چنین کلاس هایی در برنامه ها به معنای مصرف زیاد باتری در دیوایس خواهد بود و این همان عامل بازدارنده ای است  که کاربران زیادی را ناراحت خواهد نمود.

و برای کنسل کردن عملیات فوق از روش زیر استفاده می کنیم:

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

Intent i = new Intent(MainActivity.this, MyReceiver.class);

PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, i, 0);

alarmManager.cancel(pi);

 

TimerTask – در UIThread به خوبی اجرا نمی شود و قابل اعتماد نیست. بهتر است که هرگز از TimerTask استفاده نکنیم

 


0 دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

-- بارگیری کد امنیتی --