آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

PandaStudio  11 سال پیش  11 سال پیش
+2 0

سلام دوستان

من برای برنامم یه قسمت نوشتم که وقتی یک 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 به صورت نامنظم کم و زیاد میشه. به نظرتون چطور مشکلش را حل کنم؟

 

+6 0
اولا ترد برای اینکار نیست - handler.postDelayed رو استفاده کن و ثانیا از یه فلگ بولین برای فشرده بودن یا نبودن دکمه استفاده کنی این مشکل تداخل پیش نمیاد (11 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
PandaStudio  11 سال پیش
0 0

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

 

 

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

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