مشکل متوقف کردن Thread
من میخوام یه تایمر بسازم که با زدن یه دکمه متوقف بشه و با زدن دوباره همون دکه ادامه بده!
ولی مشکل اینجاست که متد های Stop , Resume در Thread منسوخ شدن و راه حل درستی در دست نیست !
تویه سایت هم سرچ کردن بیشتر بچه ها میگفتن از یه متغییر بولین تویه شرط استفاده کنید که اینم راه حل جالبی نبود!
از دوستان میخوام که اگه راه حل درستی دارن راهنماییم کنن!
ترد هیچوقت متوقف نمیشه مگر اینکه دستورات درونش تموم بشه ، مثلا اکر حلقه ایی دارید < اون حلقه باید بشکنه <
boolean canwork = true;
private void mymethod(final int counter){
new Thread (Run . . .){
while(canwork) {
counter++;
}
}
}
مقدار canWork رو از بیرون false کنید < حلقه از کار میوفته <
برای ادامه دادن Counter یک مقدار به متد بفرستید و قبل از صدا زدن متد مقدار canwork رو true کنید بعد از اون با false کردن مقدار canwork میتونید حلقه رو بشکنید و کار ترد تموم میشه
thread = new Thread(new Runnable() { public void run() { while (time < percent && mustThread) {
//perecent تایم مورد نظر try { Thread.sleep(200); time++; Log.i("Time", time + ""); cusTimer.setPresent(time, numberMin, numberSec);
//کنترل سفارشی } catch (InterruptedException e) { e.printStackTrace(); } } } });
_______________________________________________________________________________________
//موقع شمارش زمان
imgPlay.setOnClickListener(new OnClickListener() { public void onClick(View v) { mustThread = true; thread1.start(); } });
_______________________________________________________________________________________
//موقع از سر گیری زمان بعد از توقف
imgBell.setOnClickListener(new OnClickListener() { public void onClick(View v) { mustThread = true; thread1.start(); // مشکل اینجاست
} });
_________________________________________________________________________________________
// توقف تایم
imgStop.setOnClickListener(new OnClickListener() { public void onClick(View v) { mustThread = false; } });
سلام
از کلاس Timer استفاده کنید . یه متد داره به نام cancel که راحت میتونی تایمر رو متوقف کنی . و البته برای شروع مجدد تایمر باید یک timer جدید بسازید :
long firstTime;
long currentTime;
long elapsedTime;// زمان سپری شده در هر فراخوانی تایمر
long lastElapsedTime = 0;// زمان سپری شده در کل فراخوانی ها و توقف ها
Timer timer;
//=================================================================================
private void startTimer(long lastElapsedTime) {
firstTime = System.currentTimeMillis();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
currentTime = System.currentTimeMillis();
elapsedTime = (currentTime - FirstTime) + lastElapsedTime;
// UI کارهایی که قراره هر 1 میلی ثانیه انجام بشه مثل نمایش زمان سپری شده به میلی ثانیه و آپدیت
}
}, 1, 1);
}
هر موقع خواستی تایمر رو شروع کنی ، متد startTimer رو با پارامتر مجهول lastElapsedTime صدا بزن و کدهای خودتو بنویس و UI رو آپدیت کن . و هر موقع خواستی تایمر رو متوقف کنی متد StopTimer رو صدا بزن تا cancel بشه :
private void stopTimer() {
if (timer != null) {
timer.cancel();
lastElapsedTime = elapsedTime ; // ذخیره آخرین زمان ثبت شده
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .