【问题标题】:Sleep oder wait in For-Loop在 For-Loop 中休眠或等待
【发布时间】:2012-09-10 15:43:07
【问题描述】:

我正在尝试根据摩尔斯电码(文本)中的给定文本打开和关闭特定长度(out_tic)的 LED。 我尝试使用“postDelay”以及 sleep() 或 wait() 来解决这个问题,但是 flash 的长度总是相同或应用程序崩溃.. 我认为这是因为 Flash 被告知在尚未关闭时启动。

cam = Camera.open();
    Handler handler = new Handler(); 
    for(int i=0;i<Text.length();i++){

        if(Text.charAt(i)=='.' ||Text.charAt(i)=='·'){
            ledon();
            handler.postDelayed(new Runnable() { 
                 public void run() {
                     ledoff();
                     } 
            }, out_tic);


        }
        else if(Text.charAt(i)=='-'){
            ledon();
            handler.postDelayed(new Runnable() { 
                 public void run() {
                     ledoff();
                     } 
            }, 3*out_tic);
        }
        else if(Text.charAt(i)=='/'){
            if(Text.charAt(i-1)=='/'){

            }
        }

    }

ledon() 和 ledoff() 方法只是设置参数并启动/停止预览。

感谢您的帮助!

适合我的新代码:

(由于 JRaymond)

final String Text = "./-..-/.-/--/.--./.-.././/";
final int out_tic = 200;

new Thread(new Runnable(){
        @Override
        public void run() {
        for(int i=0;i<Text.length();i++){

        if(Text.charAt(i)=='.' ||Text.charAt(i)=='·'){
        flash(out_tic);
        flashpause(out_tic);
        continue;
        }
        else if(Text.charAt(i)=='-'){
        flash(3*out_tic);
        flashpause(out_tic);
        continue;
        }
        else if(Text.charAt(i)=='/'){
            flashpause(2*out_tic);
            if(Text.charAt(i-1)=='/'){
                flashpause(4*out_tic);
                    }
                }
            }
        }   
    }).start();
}

        private Handler handler = new Handler();
private void flash(final int sleeptime) {
    handler.post(new Runnable() {
        @Override
        public void run() {
            ledon();
        }
    });
    try {
        Thread.sleep(sleeptime);
    } catch (InterruptedException e){
    }
    handler.post(new Runnable(){
        public void run() {
            ledoff();
        }
    });
}

private void flashpause(final int sleeptime)    {
        try {
            Thread.sleep(sleeptime);
            } catch (InterruptedException e){
            }
}

private Camera cam;
private void ledon() {
    cam = Camera.open();     
    Parameters params = cam.getParameters();
    params.setFlashMode(Parameters.FLASH_MODE_TORCH);
    cam.setParameters(params);
    cam.startPreview();
}
private void ledoff() {
    cam.stopPreview();
    cam.release();
}

【问题讨论】:

  • 我假设您使用的是 FLASH_MODE_TORCH?请注意,并非所有设备都支持此模式
  • @JRaymond 是的,我正在使用 FLASH_MODE_TORCH。其实手电筒效果不错,但不是每次闪光的长度。

标签: java android wait flashlight postdelayed


【解决方案1】:

我想我已经解开了你的谜题——你所有的 runnables 都被发布了,所以它们几乎同时发生。 postDelayed 从现在开始安排 Runnable,而不是从最后一次安排 Runnable 开始。我认为您最好的解决方案是这样的,它将 LED 控件卸载到另一个线程:

cam = Camera.open();
Handler handler = new Handler();
new Thread(new Runnable() {
  public void run() {
    for(int i=0;i<Text.length();i++){
      if(Text.charAt(i)=='.' ||Text.charAt(i)=='·') {
        flash(out_tic);
        continue;
      }
      else if(Text.charAt(i)=='-'){
        flash(3 * out_tic)
        continue;
      }
      // I don't quite understand what this does, but the same principles apply
      else if(Text.charAt(i)=='/'){
        //Warte 2*out_tic lang (1mal wurde schon gewartet)
        if(Text.charAt(i-1)=='/'){

        }
      }
    }
  }
  private void flash(int tic) {
    handler.post(new Runnable() {
      public void run() {
        ledon();
      }
    });
    try {
          Thread.sleep(out_tic);
    } catch (InterruptedException e) {
    }
    handler.post(new Runnable() {
      public void run() {
        ledoff();
      }
    }
  }
});

请注意,上面的内容非常混乱,您可能想要移动一些东西并稍微清理一下 - 但我们的想法是让 UI 中的另一个线程进行睡眠,然后在需要更改相机参数。

【讨论】:

  • @JRaymond 谢谢!!我对其进行了一些更改,现在它可以正常工作了:我只是等待操作根本不准确,但是对于更大的术语,它非常适合:) 源代码可以在顶部找到;)
  • @Alrick 是的,Thread.sleep() 方法不是超级精确 - 但对于大多数用途来说,它运行良好 - 很高兴我能提供帮助!
猜你喜欢
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多