2016-05-02 256 views
0

Android应用程序与处理程序backpress和照相机Android应用程序崩溃

我试图使用相机的SOS应用程序,代码运行后,当我们启动SOS闪光灯使用按钮单击崩溃为了保持闪光灯跑,我使用的处理器与后延迟

应用程序崩溃时,我们使用backpress回到以前的活动

我一直在使用handler.removeCallbacks(r);尝试,onbackpress但仍是应用程序崩溃

这是我想

public class sos extends Activity { 
    String myMorseString = "111000111"; 
    int sleepTime; 
    Camera cam; 
    Handler handler; 
    Runnable r; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sos); 
     ImageButton button = (ImageButton) findViewById(R.id.Start); 
     button.setOnClickListener(new View.OnClickListener() { 


      public void onClick(View v) { 
       startsos(); 
      } 
     }); 
    } 

    public void startsos() { 
     // new Thread() { 
     handler = new Handler(); 
      r = new Runnable() { 
      public void run() { 
       if (myMorseString != null) { 
        for (int x = 0; x < myMorseString.length(); x++) { 

         if (myMorseString.charAt(x) == '2') { 
          cam = Camera.open(); 
          sleepTime = 500; 
          Parameters p = cam.getParameters(); 
          p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
          cam.setParameters(p); 
          cam.startPreview(); 
          try { 
           Thread.sleep(sleepTime); 
          } catch (InterruptedException e) { 

          } 
          // power off after signal 
          cam.stopPreview(); 
          cam.release(); 
          cam = null; 
          try { 
           Thread.sleep(100); 
          } catch (InterruptedException e) { 

          } 
         } 

         if (myMorseString.charAt(x) == '1') { 
          cam = Camera.open(); 
          sleepTime = 250; 
          Parameters p = cam.getParameters(); 
          p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
          cam.setParameters(p); 
          cam.startPreview(); 
          try { 
           Thread.sleep(sleepTime); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 

          // power off after signal 
          cam.stopPreview(); 
          cam.release(); 
          cam = null; 
          try { 
           Thread.sleep(100); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
         } 

         if (myMorseString.charAt(x) == '0') { 
          cam = Camera.open(); 
          sleepTime = 250; 
          Parameters p = cam.getParameters(); 
          cam.setParameters(p); 
          //cam.startPreview(); 
          cam.stopPreview(); 
          cam.release(); 
          cam = null; 

          try { 
           Thread.sleep(sleepTime); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       } 
       handler.postDelayed(this, 10000); 
      } 
      // }.start(); 


     }; 

     handler.postDelayed(r, 10000); 
    } 

    @Override 
    protected void onDestroy() { 

     super.onDestroy(); 
    } 

    @Override 
    protected void onPause() { 

     super.onPause(); 
    } 

    @Override 
    public void onBackPressed() { 
     handler.removeCallbacks(r); 
     finish(); 
     super.onBackPressed(); 
    } 
} 
+0

你可以发布堆栈跟踪吗? – John

+1

我认为在'onBackPressed'中调用'finish()'是个问题。当调用'super.onBackPressed()',你的活动将完成。通过显式调用'finish()',我认为你正在引入错误。你可以删除'finish()'作为'super.onBackPressed()'也会破坏你的活动 – 0xDEADC0DE

+0

而不使用finish也应用程序崩溃 – 1234567

回答

0

这是最有可能崩溃,因为被压回时,相机预览不被停止的代码。 Runnable刚刚从Handler中删除。

这就是说,你也会看到另一个问题:在onClick()处理程序中创建一个Handler不会创建一个新的线程。它仍然创建一个绑定到您的主线程的Handler。在主(UI)线程上调用onClick()(和任何视图相关的回调)。所以sleep()调用你正在制作的Runnable正在发生在你的主线程上,这很糟糕。

+0

你能解释代码与上面的代码我试过以下@Override public void onBackPressed ){ // cam = Camera.open(); 参数p = cam.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_OFF); cam.setParameters(p); cam.stopPreview(); cam.release(); cam = null; Thread.interrupted(); super.onBackPressed(); },现在闪存不会停止 – 1234567

+0

不幸的是,一些设备可能会非常挑剔这是如何工作的。例如,在某些设备上,您不需要预览开始,但是需要在其他设备上开始预览。您可能需要考虑使用“Camera2”API,因为原始的“Camera”API已被弃用。 –