1

次のユースケースを持つアプリを作成しています。ユーザーが[開始]をクリックします。ボタンをクリックすると、アプリは1分ごとに(CameraPreviewクラスを内部的に使用して)画像のクリックを開始し、ボタンのテキストを「完了!」に変更します。

ユーザーが同じボタンを押すと(ただし、新しいボタンテキスト「Done!」が表示されます)、アプリは停止します。

ユーザーが「開始」をクリックすると、1分ごとに画像をクリックするコードを書くことができました。ボタン。ただし、画像のキャプチャが開始されると、ボタンがフリーズします。

ボタンがフリーズしないように、1分ごとに画像をキャプチャするロジックを実行するにはどうすればよいですか?その周りのベストプラクティスは何ですか?ありがとう!

OnClick()のコードは次のとおりです。

    @Override
public void onClick(View v) {
    Button button = (Button)v;
    String buttonText = button.getText().toString();

    if(buttonText.equals(Constant.trainButtonText)) {
        Log.i(TAG, "Robot Training started...");

        while(true) {
            surfaceView.capture(new Camera.PictureCallback() {
                public void onPictureTaken(byte[] data, Camera camera) {
                    Log.v("Still", "Image data received from camera");

                    String[] params = new String[] {
                            Constant.Server, // Server URL
                            Long.toString(new Date().getTime()), // Image Timestamp
                            Constant.userId // Unique user ID for each customer
                    };
                    new UploadImageToWebServiceTask(data).execute(params);
                    camera.startPreview();
                }
            });
            try {
                // Capture every 1 minute until 'training done!' is not clicked
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
    else if(buttonText.equals(Constant.doneTrainingButtonText)) {
        Log.i(TAG, "Robot Training completed...");
        button.setText(Constant.trainButtonText);
        button.clearFocus();
    }
}

コードでは、同じボタンが使用されています。ボタンのテキストに基づいて何をするかを決定するだけです。

4

1 に答える 1

2

UIスレッドをブロックせず、Runnableに切り替えます。また、あなたは毎秒写真を撮っています:1000は1秒、60000は1分です。

まず、新しいフィールド変数を作成します。

public class MainActivity extends Activity {
    Runnable takePictures = new Runnable() {
        @Override
        public void run() {
            // I'll trust that this code works
            surfaceView.capture(new Camera.PictureCallback() {
                public void onPictureTaken(byte[] data, Camera camera) {
                    Log.v("Still", "Image data received from camera");

                    String[] params = new String[] {
                            Constant.skynetNNServer, // Server URL
                            Long.toString(new Date().getTime()), // Image Timestamp
                            Constant.userId // Unique user ID for each customer
                    };
                    new UploadImageToCloudTask(data).execute(params);
                    camera.startPreview();
                }
            });

            // Call this runnable again in 60 seconds (60000 milliseconds) 
            surfaceView.postDelayed(this, 60000);
        }
    };
    // Rest of your code

次に、onClickメソッドを変更します。

@Override
public void onClick(View v) {
    Button button = (Button)v;
    String buttonText = button.getText().toString();

    if(buttonText.equals(Constant.trainButtonText)) {
        Log.i(TAG, "Robot Training started...");
        surfaceView.post(takePictures);
    }
    else if(buttonText.equals(Constant.doneTrainingButtonText)) {
        Log.i(TAG, "Robot Training completed...");
        surfaceView.removeCallbacks(takePictures);
        button.setText(Constant.trainButtonText);
        button.clearFocus();
    }
}
于 2012-12-02T06:35:04.347 に答える