使用Handler和Camera进行反印后Android应用程序崩溃

时间:2016-05-02 14:17:26

标签: android android-camera onbackpressed

Android应用程序在使用处理程序和相机

进行反印后崩溃

我正在尝试使用相机作为SOS应用程序,当我们使用按钮单击启动sos flash时代码运行,以保持闪光灯运行,我使用Handler with Post delay

当我们使用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();
    }
}

1 个答案:

答案 0 :(得分:0)

它很可能会崩溃,因为按下后退时相机预览不会停止。 Runnable刚刚从Handler中移除。

话虽如此,您还会看到另一个问题:在Handler处理程序中创建onClick()并不会创建新线程。它仍在创建一个绑定到主线程的Handler。在主(UI)线程上调用onClick()(以及任何与视图相关的回调)。因此,您在sleep()中进行的Runnable调用正在主线程上发生,这非常糟糕。