Android应用程序在运行时间无需花费一些时间工作,如何解决此问题



我是Android开发和学习Android应用程序开发的新手。我为Android设备创建了一个非常基本和简单的手电筒。运行应用程序时,我正面临问题,需要花费一些时间来运行,例如我按闪光灯打开闪光灯(半秒或更少,但需要一些时间),我没有使用wait()方法在我的应用中。如何真正快速运行它,就像用户单击它闪存打开或关闭?

public class MainActivity extends AppCompatActivity {
private ImageButton imageButton;
private Camera camera;
private boolean isFlashOn;
private boolean hasFlash;
private Camera.Parameters params;
private MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageButton = (ImageButton) findViewById(R.id.switch_btn);
    //Check that Device has supports flash or not
    hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    if (!hasFlash){
        //If device does not supports Flash
        AlertDialog alert = new AlertDialog.Builder(MainActivity.this).create();
        alert.setTitle("Error");
        alert.setMessage("Sorry, your current device does not support to Little Flashy! ops");
        alert.setButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //Close application
                finish();
            }
        });
        alert.show();
        return;
    }

    //Get the Camera
    getCamera();
    //Display button image
    toggleButtonImage();
    imageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isFlashOn) {
                turnOffFlash();
            } else
            {
                turnOnFlash();
            }
        }
    });
}
private void toggleButtonImage() {
    if (isFlashOn){
        imageButton.setImageResource(R.drawable.btn_switch_on);}
    else {imageButton.setImageResource(R.drawable.btn_switch_off);}
    }
private void getCamera() {
    if (camera == null){
        try{
            camera = camera.open();
            params = camera.getParameters();
        }catch (RuntimeException e){
            Log.d("Camera Error.", e.getMessage());
        }
    }
}
/*
 * Turning On flash
 */
private void turnOnFlash() {
    if (!isFlashOn) {
        if (camera == null || params == null) {
            return;
        }
        // play sound
        playSound();
        params = camera.getParameters();
        params.setFlashMode(Parameters.FLASH_MODE_TORCH);
        camera.setParameters(params);
        camera.startPreview();
        isFlashOn = true;
        // changing button/switch image
        toggleButtonImage();
    }
}
/*
 * Turning Off flash
 */
private void turnOffFlash() {
    if (isFlashOn) {
        if (camera == null || params == null) {
            return;
        }
        // play sound
        playSound();
        params = camera.getParameters();
        params.setFlashMode(Parameters.FLASH_MODE_OFF);
        camera.setParameters(params);
        camera.stopPreview();
        isFlashOn = false;
        // changing button/switch image
        toggleButtonImage();
    }
}
private void playSound() {
    if (isFlashOn){
        mp = MediaPlayer.create(MainActivity.this, R.raw.light_switch_off);}
    else {
        mp= MediaPlayer.create(MainActivity.this, R.raw.light_switch_on);
    }
    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.release();
        }
    });
    mp.start();
}
@Override
protected void onDestroy() {
    super.onDestroy();
}
@Override
protected void onPause() {
    super.onPause();
    //turn off flash when on Pause called
    turnOffFlash();
}
@Override
protected void onRestart() {
    super.onRestart();
}
@Override
protected void onResume() {
    super.onResume();
    if (hasFlash) turnOnFlash();
}
@Override
protected void onStart() {
    super.onStart();
    getCamera();
}
@Override
protected void onStop() {
    super.onStop();
    if (camera != null){
        camera.release();
        camera = null;
    }
}
}

在打开和关闭闪光灯之前,请调用使用MediaPlayerplaySound方法。此方法很慢,会导致您的延迟。首先尝试将其删除(通过发表评论)并查看差异。接下来,您可以尝试从线程运行它。

是的,您可以忽略当前时间的声音功能。或者,如果您真的想要此功能,而不是通过线程使用它,则在用户打开或关闭Flash时不会显示应用程序中的滞后或延迟。

最新更新