آموزش تایمر در اندروید
سلام دوستان این بار با آموزش تایمر در اندروید بازگشتیم این آموزش هر چند دیده نمی شود ولی کارایی بسیار بالایی دارد.خب برویم به سراغ بخش کد برنامه شیرین ترین بخش ! 🙂
1 2 3 4 5 6 7 | Timer timerObj = new Timer(); TimerTask timerTaskObj = new TimerTask() { public void run() { //perform your action here } }; timerObj.schedule(timerTaskObj, 0, 15000); |
ابتدا یک object از تایمر ایجاد کرده سپس باید یک TimerTask برای زمان بندی تایمر ایجاد شده ایجاد کنیم بعد از آن یک void ایجاد کرده سپس در این void که از نام آن run است را اجرا می کنیم و در اخر بعد از بسته شدن void زمان زمانی بندی کردن تایمر ایجاد شده می کنیم برای این کار از ویژگی Schedule (به معنی زمان بندی) را فراخوانی کرده و در آخر “زمان” را برای تایمر ست می کنیم تایمر را باید به میلی ثانیه بدهیم به طور مثال یک ثانیه برابر است با 1000 میلی ثاینه .
شاید بخواهید یک تایمر تکرار ایجاد کنید برای این کار می توانیم از کد زیر استفاده کنیم.
1 2 3 4 5 6 7 8 | Timer timer = new Timer(); TimerTask t = new TimerTask() { int sec = 0; @Override public void run() { } }; timer.scheduleAtFixedRate(t,1000,1000); |
کد بالا نیز شبیه کد قبلی است با این تفاوت که این تایمر 1000 بار اجرا می شود یعنی بعد از هر یک ثانیه تا 1000 بار اجرا می شود.
برویم به سراغ شمارنده (counter) معکوس به کد زیر نگاه کنید.
1 2 3 4 5 6 7 8 | new CountDownTimer(30000, 1000) { public void onTick(long millisUntilFinished) { mTextField.setText("Seconds remaining: " + millisUntilFinished / 1000); } public void onFinish() { mTextField.setText("Done"); } }.start(); |
از کد بالا برای ایجاد تایمر معکوس استفاده کنیم و کنترلی بیشتری نسبت به تایمر های قبلی داریم به این صورت که در صورت تموم شدن این تایمر پیغام Done نمایش داده می شود.
این بخش مخصوص تایمر است ولی گفتم شاید بعضی از دوستان به کد زیر نیاز داشته باشند کد زیر یه کار به صورت پشت سر هم بعد از یک فاصله زمانی احرا کند.به طور مثال می خواهید اینترنت را هر 15 ثانیه یک بار چک کنید برای این کار می توانید از کد زیر استفاده کنید.
1 2 3 4 5 6 7 | final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { //Do something after 100ms } }, 1000); |
کد بالا بعد از فاصله زمانی یک ثانیه ای یک دکد را اجرا می کند ولی استفاده بیش از حد از کد بالا سبب memory leak می شود.
استفاده از کد بالا به صورت ساده شده مانند زیر
1 2 3 4 5 6 | new Handler().postDelayed(new Runnable() { @Override public void run() { //Do something after 100ms } }, 1000); |
کدی قوی تر از کد های بالا کد زیر از api ورژن 1 تا 24 کار می کند و کد قدرتمندی است.
1 2 3 4 5 6 | new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { @Override public void run() { //Do something here } }, 5000); |
کد بالا بعد هر 5 ثاینه یک کار را انجام می دهد.
در صورت استفاده از کد بالا ممکن است به ارور بر بخورید زیرا کد های بالا در یک ترد دیگر است به طور مثال اگر بخواهید مقدار متن یک دکمه را تغییر دهید باید از RunOnUiThread استفاده کنید همانند زیر
1 2 3 4 5 6 7 8 9 10 11 | runOnUiThread(new Runnable() { @Override public void run() { new Handler().postDelayed(new Runnable() { @Override public void run() { //Do something after 1 second } }, 1000); } }); |
کد های مختلفی از این دست برای تایمر وجود دارد همانند زیر
1 2 3 4 5 6 | new Timer().schedule(new TimerTask() { @Override public void run() { // this code will be executed after 2 seconds } }, 2000); |
آموزش به اتمام رسید انشاالله مفید بوده باشد.
فوقالعاده بود
خیلی ممنون
خیلی کلی و مبهم بود
سلام مثل همیشه عالی فقط اگر بخوایم تایمی که داره میگذره رو نمایش بدیم چطور؟؟
سلام و درود برای اینکار می توانید از این کد استفاده کنید.
فقط باید متد بالا را در یک Thread قرار دهید تا هر یک ثانیه یکبار انجام شود یعنی مثل زیر
موفق باشید.
عالی بود ممنون فقط ی سؤال ک چرا بیشتر کدها تو API 21+ کار نمیکنن؟؟
Timer timer = new Timer();
TimerTask t = new TimerTask() {
int sec = 0;
@Override
public void run() {
}
};
timer.scheduleAtFixedRate(t,1000,1000
کد بالا رو وقتی اجرا میکردم برنامه کرش میشد.کدی مثل همین نیست که در api +21 یک سری کد رو براساس زمان داده شده(مثلا هزاربار) اجرا کنه؟؟
سلام و درود
نباید مشکلی داشته باشد کد خطا را قرار دهید تا بررسی کنیم یک try و catch براش بزارید ببیند در بخش log چه چیزی دریافت می کنید.
موفق باشید.
با سلام
میخواستم کد تایم معکوس بالا رو به دقیقه ای تغییر بدم مثلا بجای اینکه 120 ثانیه رو از 120 ثانیه شروع کنه(118.119.120و…) از دقیقه ی 1:59 شروع کنه(1:58.1:59.1:59و…) ممنون میشم کمکم کنید.
سلام و دورد
چیزی که می خواهید یک مسئله ساده ریاضی است هر ساعت 60 دقیقه است هر ساعت 3600 ثانیه است هر ساعت 60 دقیقه است به 3 if ساده می توانید پیاده سازی کنید.
موفق باشید.
سلام می خواهم وقتی گوشی خاموش و روشن میشه تایمر قطع نشه چجوری کدش رابنویسم؟
با سلام یه سرویس نوشتم میخوام هر 24 ساعت یه نوتیفیکیشن بزنه . از کلاس CountDownTimer استفاده میکنم ولی فقط برای پایین تر از یک ساعت جواب میده و درست کار میکنه به نظرتون زمان 24 ساعت از چه کلاسی استفاده کنم و بهش بدم تا 24ساعت وقفه ایجاد کنه؟
برای اپلیکیشن نیاز داشتم که یک سرویس تعریف کنم برای اجرای یک سری کد در بازه زمانی 10 ثانیه ای اومدم از کد زیر استفاده کردم
دستورات 1 :
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
}
}, 1000);
این کد مشکلی که داشت این بود که بعد از 20 30 دقیقه سرویس از کار میافتاد اومدم CONNECTIVITY_CHANGE رو هم هندل کردم ولی خب مشکل همچنان پا برجا بود بعد از 20 30 دقیقه سرویس از کار میافتاد
اومدم از دستورات زیر استفاده کردم
دستورات 2 :
Timer timer = new Timer();
TimerTask t = new TimerTask() {
int sec = 0;
@Override
public void run() {
}
};
timer.scheduleAtFixedRate(t,1000,1000);
الان مشکلی که دارم اینه که مصرف باطری گوشی رفته در دستورات 1 مصرف باطری 2 تا 4 درصد متغییر بود ولی دستورات 2 مصرف باطری رو بین 10 تا 15 درصد برده بالا
برای این مورد چیکار میشه کرد ؟
سلام خسته نباشید من میخواستم یک شی مثلا یک توپ رو از بالای صفحه با پایین بیارم و وقتی به پایین رسید دوباره از بالا شروع بخ پایین اومدن بکنه
لطفا اگر میشه منو راهنمایی کنید ممنون میشم
سلام من میخواستم یه برنامه بسازم که یه ویجت داشته باشه و یه دیتابیس
ویجت متن های توی دیتابیس رو نشون بده
یعنی هر متن ۲۴ ساعت یک بار تغییر کنه
ممنون میشم کمکم کنید یا یه اموزش بهم معرفی کنید
سلام خسته نباشید
من یه برنامه دارم می نویسم که دو تا تابع داره یکی از توابع طول اجرا شدنش 8 ثانیه است و دومی 3 ثانیه می خوام وقتی تابع اولی دو فراخوانی کردم 4 ثانیه بعد تابع دومی هم شروع به کار بکنه بدون این که اجرای اولی متوقف بشه .
فکر کنم منظورم رو خب رسوندم .
آره دیگه روشش رو نمی دونم .
یه روش تو مطلبتون که خیلی عالی بود گذاشتین ولی استفاده زیادش باعث مموری لیک میشه روش دیگه ای نیست؟؟؟