Android中的主题。救命?

时间:2011-11-28 15:02:06

标签: android multithreading listener seekbar

我正在尝试为手电筒应用编写新功能。我很确定我需要一个新线程才能做到这一点。但是,我是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 个答案:

答案 0 :(得分:3)

我不确定每次进度发生变化时是否需要创建新线程,更好的方法可能是创建一个最终的runnable,在其中更改整数值:

onProgressChange:

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

runnable-implementation:

    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方法的外观。