Темы в Android. ПОМОГИТЕ? - PullRequest
       12

Темы в Android. ПОМОГИТЕ?

0 голосов
/ 28 ноября 2011

Я пытаюсь написать новую функцию для фонарика.Я уверен, что мне нужна новая тема, чтобы сделать это.ОДНАКО, я новичок в Threads и вообще не знаю, как это сделать.То, что я пытаюсь сделать, - это смена SeekBar, я хочу, чтобы строб получался быстрее / медленнее.Если это 0 или 1 возобновить к постоянному свету.

Это неправильно, но это то, что у меня есть.Всякий раз, когда я перемещаю SeekBar, он правильно срабатывает, но вы не можете остановить его ..

В onCreate ():

    mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
        final int myInt = progress;
        new Thread (new Runnable() {
          public void run() {
            if (myInt>1)
                strobeLight(myInt);
            else {}
                // Stop Strobe
          } }).start();
      }
      public void onStartTrackingTouch(SeekBar seekBar) {}
      public void onStopTrackingTouch(SeekBar seekBar) {}          
    });

strobeLight () метод:

public void strobeLight(int myInt){
    do {
    if (myInt>1){
            if (strobe){
                processOffClick();
                try { Thread.sleep(300/myInt); }
                    catch (InterruptedException e) {}
                strobe=false; 
                strobeActivated=true;}
            else{
                processOnClick();   
                try { Thread.sleep(300/myInt); }
                    catch (InterruptedException e) {}                       
                strobe=true; }
        }
    else{
        processOnClick();
        strobe=false; 
        Thread.currentThread().interrupt(); 
        strobeActivated=false;}

    } while (strobeActivated);
} 

1 Ответ

3 голосов
/ 28 ноября 2011

Я не уверен в необходимости создания нового потока каждый раз, когда изменяется ход выполнения, лучшим подходом может быть создание окончательного runnable, в котором вы меняете целочисленное значение:

onProgressChange:

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
        toRun.interval = progress;
    }

Runnable-реализация:

    class StrobeRunnable implements Runnable {
        volatile boolean running;
        volatile int interval = 0;
        private boolean lightIsOn = false;

        @Override
        public void run() {
            while(running){
                if (interval > 1){
                    Thread.sleep(300/interval);
                    lightIsOn = !lightIsOn;
                    switchLight(lightIsOn);
                }
                else{
                    Thread.sleep(600/interval);
                    if( !lightIsOn ){
                        lightIsOn = true;
                        switchLight(lightIsOn);
                    }
                }
            }
        }
    };

Обратите внимание, что я создал новые имена для некоторых методов, switchLight (boolean isLightOn) - это то, что, как я полагаю, выполнял ваш processXClick ранее, а именно: включите или выключите свет,И интервал раньше назывался myInt.

Чтобы запустить поток, я предпочитаю использовать Executors:

    StrobeRunnable toRun = new StrobeRunnable();
    Executor exec = Executors.newSingleThreadExecutor();
    exec.execute(toRun);

Чтобы полностью остановить запуск потока, установите toRun.running в false, иэто остановит рабочий цикл.

Я не проверял это, но он должен работать.Это также немного зависит от того, как выглядит ваш processClick-метод.

...