وقتی که روند کار مشخصه نیازی به حلقه نا محدود نداری - بدون حلقه while پیاده کن، اجازه بدنه هندلر در مورد فراخوانی مجدد خودش تصمیم بگیره. کارایی فلگ در اینصورت معلوم میشه. درکل به هیچ حلقه ای نیاز نیست
بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ
چطور با نگه داشتن button یک متغیر را افزایش و با برداشتن کاهش بدم؟
مدیریت گفتگو
آخرین تغییر: 11 سال پیش
سلام دوستان
من برای برنامم یه قسمت نوشتم که وقتی یک Button را نگه دارم یه متغیر مقدارش با یه سرعت ثابتی زیاد بشه تا به 255 برسه و وقتی اون را رها میکنم با سرعت بیشتری کم بشه تا به صفر برسه. نمونه کدم اینه
private Thread threadDown = null; private Thread threadUp = null;
private int test = 0;
btnStart.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { switch (arg1.getAction()) { case MotionEvent.ACTION_DOWN: if (threadUp != null) { if (threadUp.isAlive()) { threadUp.interrupt(); } } threadDown = new Thread(new Runnable() { @Override public void run() { while (test < 255) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } test++; G.HANDLER.post(new Runnable() { @Override public void run() { txtTest.setText("" + test); } }); } } }); threadDown.start(); break; case MotionEvent.ACTION_UP: if (threadDown != null) { if (threadDown.isAlive()) { threadDown.interrupt(); } } threadUp = new Thread(new Runnable() { @Override public void run() { while (test> 0) { try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } test--; G.HANDLER.post(new Runnable() { @Override public void run() { txtTest.setText("" + test); } }); } } }); threadUp.start(); break; } return true; } });
حالا مشکلش اینه که thread ها باهم تداخل پیدا میکنند و مقدار متغیر test به صورت نامنظم کم و زیاد میشه. به نظرتون چطور مشکلش را حل کنم؟
پاسخها 1
این کد را با handler که گفتید نوشتم اما جواب نمیده مشکلش کجاست؟
btnStart.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN:
state = true;
while ((test < 255) && (state == true)) {
G.HANDLER.postDelayed(new Runnable() {
@Override
public void run() {
test++;
txtTest.setText("" + test);
}
}, 10);
}
break;
case MotionEvent.ACTION_UP:
state = false;
while ((test > 0) && (state == false)) {
G.HANDLER.postDelayed(new Runnable() {
@Override
public void run() {
test--;
txtTest.setText("" + test);
}
}, 5);
}
break;
}
return true;
}
});
نظرات
ممنون مشگلم حل شد. البته همون روش اول هم با فلگ درست میشه و تداخلی یش نمیاد
بله مشکل حل میشه ولی تو مستندات اندروید ترد رو برای اینکار مناسب ندونسته. از همون هندلر استفاده کنی کارایی بهتری داره
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
ویرایش
پیام
نظرات