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