3

フルスクリーンを使用するアクティビティがあり、プレビュー用にカメラを開きます(コードSurfaceHolderに基づく)。zxing

このアクティビティの開始が遅い (1.x 秒) のは、カメラ マネージャーの負担が大きいためだと思います。onResumeメソッドを使用しています。内にコードを移動するのは良い考えAsyncTaskですか?

すぐにレイアウトをレンダリングしてからカメラを待ちたいと思います (ユーザー エクスペリエンスが向上すると思います)。どうすればこれを処理できますか?

アクティビティ

private class CameraTask extends AsyncTask<Void, Void, Void> {
    SurfaceHolder.Callback callback;

    public CameraTask(SurfaceHolder.Callback callback) {
        this.callback = callback;
    }
    protected void doInBackground() {
        cameraManager = new CameraManager(getApplication());
        viewfinderView = (ViewFinderView) findViewById(R.id.viewfinder_view);
        viewfinderView.setCameraManager(cameraManager);
        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
        SurfaceHolder surfaceHolder = surfaceView.getHolder();

        if (hasSurface) {
            initCamera(surfaceHolder);
        } else {
            surfaceHolder.addCallback(callback);
        }
    }
}

このコードにはエラーはありませんが、レイアウト レンダリングはカメラが開くまで待機します。AsyncTaskinの execute メソッドを呼び出しonResumeていますが、正しい場所ですか?

4

2 に答える 2

1

これがあなたの答えです(注意部分):

http://developer.android.com/reference/android/hardware/Camera.html#open%28int%29

AsyncTaskすぐに実行されない可能性があるため、見た目ほど単純ではなく、他の回答で示唆されているほど単純ではないことに注意してください。したがって、次のことを考慮してください。 を開始するAsyncTaskと、 を呼び出すメイン スレッドにコンテキストが切り替えられonPause()ます。カメラへの参照が null であるため、 release は呼び出されません。しかしAsyncThread、カメラを開いて再び実行を開始します。これで、まだ開いているオブジェクトActivityを保持している一時停止ができました。Camera関係のないすべて:

  • ある時点で AsyncTask に参加する

  • または何らかの同期方法を使用する

  • またはカメラで順次操作を実行する

競合状態、エラー (開かれていないカメラでカメラ メソッドを呼び出す場合など)、およびリソースのリークにつながる可能性があります。

于 2013-07-24T15:13:16.703 に答える