بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

چطور با نگه داشتن button یک متغیر را افزایش و با برداشتن کاهش بدم؟

مدیریت گفتگو
PandaStudio 11 سال پیش
آخرین تغییر: 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 به صورت نامنظم کم و زیاد میشه. به نظرتون چطور مشکلش را حل کنم؟

 

نظرات

اولا ترد برای اینکار نیست - handler.postDelayed رو استفاده کن و ثانیا از یه فلگ بولین برای فشرده بودن یا نبودن دکمه استفاده کنی این مشکل تداخل پیش نمیاد

پاسخ‌ها 1

PandaStudio 11 سال پیش

این کد را با 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;
            }
        });

 

 

نظرات

وقتی که روند کار مشخصه نیازی به حلقه نا محدود نداری - بدون حلقه while پیاده کن، اجازه بدنه هندلر در مورد فراخوانی مجدد خودش تصمیم بگیره. کارایی فلگ در اینصورت معلوم میشه. درکل به هیچ حلقه ای نیاز نیست
PandaStudio 11 سال پیش
ممنون مشگلم حل شد. البته همون روش اول هم با فلگ درست میشه و تداخلی یش نمیاد
بله مشکل حل میشه ولی تو مستندات اندروید ترد رو برای اینکار مناسب ندونسته. از همون هندلر استفاده کنی کارایی بهتری داره

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .