2016-05-02 310 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已被棄用。 –