繁体   English   中英

为什么我的 Android App 的 Java 代码生成 2 个线程?

[英]Why does my Java code for Android App Generate 2 threads?

我是 android 编码的 Java 新手。 我需要了解为什么我的代码会生成 2 个线程。 在这里可以创建的问题可能是对相机资源的竞争,这会导致用户无法使用相机。 请提出解决我的问题的方法。

我还附上了一张图片,其中有 2 个新活动的请求。 还可以通过激活 2 个线程 ID 来证明。

为清楚起见进行编辑:我想生成一个新线程,它只处理录制视频的活动,没有其他线程应该这样做。 但是有两个正在执行自己的活动来录制视频。

public class MainActivity extends AppCompatActivity implements SensorEventListener/*, ActivityCompat.OnRequestPermissionsResultCallback*/ {
    private Camera c;
    private MainActivity reference_this = this;
    private BooleanObject recorded_video = new BooleanObject("recorded_video",false);
    private BooleanObject recorded_motions_chest = new BooleanObject("recorded_motions_chest", false);
    private ChangeListener listener_change;

    public void setListener(ChangeListener arg_listener_change) {
        listener_change = arg_listener_change;
    }

    public interface ChangeListener {
        void onChange(String arg_name);
    }

    public void set_recorded_video(boolean arg_recorded_video) {
        recorded_video.set_value(arg_recorded_video);
        if (listener_change != null) { listener_change.onChange(recorded_video.get_name()); }
    }

    public void set_recorded_motions_chest(boolean arg_recorded_motions_chest) {
        recorded_motions_chest.set_value(arg_recorded_motions_chest);
        if (listener_change != null) { listener_change.onChange(recorded_motions_chest.get_name()); }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (!(getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA))) {
            this.finish();
            System.exit(0);
        }
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        this.setListener(new MainActivity.ChangeListener() {
            @Override
            public void onChange(String arg_name) {
                Log.i("CHNG", "fired");
                if (arg_name.equals(recorded_video.get_name())) {
                    VideoCapture video_capture = new VideoCapture();
                    video_capture.open(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/video_finger.mp4");
                    Mat frame = new Mat();
                    int length_video = (int) video_capture.get(Videoio.CAP_PROP_FRAME_COUNT);
                    int rate_frame = (int) video_capture.get(Videoio.CAP_PROP_FPS);
                    while (true) {
                        video_capture.read(frame);
                        Size size_img = frame.size();
                        Log.i("MAT", String.valueOf(size_img.width) + ' ' + String.valueOf(size_img.height));
                    }

                }
                else if (arg_name.equals(recorded_motions_chest.get_name())) {}
            }
        });

//        new Thread(new Runnable() {
//            public void run() {
                Button button_symptoms = (Button) findViewById(R.id.button_symptoms);
                Button button_upload_signs = (Button) findViewById(R.id.button_upload_signs);
                Button button_measure_heart_rate = (Button) findViewById(R.id.button_measure_heart_rate);
                Button button_measure_respiratory_rate = (Button) findViewById(R.id.button_measure_respiratory_rate);

                CameraView cv1 = new CameraView(getApplicationContext(), reference_this);
                FrameLayout view_camera = (FrameLayout) findViewById(R.id.view_camera);
                view_camera.addView(cv1);

                TextView finger_on_sensor = (TextView) findViewById(R.id.text_finger_on_sensor);
                finger_on_sensor.setVisibility(View.INVISIBLE);
                finger_on_sensor.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch (View arg_view, MotionEvent arg_me){
                    finger_on_sensor.setVisibility(View.INVISIBLE);
/*GENERATING THREADS OVER HERE*/ new Thread(new Runnable() {
                        public void run() {
                            File file_video = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/video_finger.mp4");
//                            final int REQUEST_WRITE_PERMISSION = 786;
                            final int VIDEO_CAPTURE = 1;
                            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
                            StrictMode.setVmPolicy(builder.build());
                            Intent intent_record_video = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                            intent_record_video.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 45);
                            Uri fileUri = FileProvider.getUriForFile(MainActivity.this, "com.example.cse535a1.provider", file_video);
                            intent_record_video.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
                            if (intent_record_video.resolveActivity(getPackageManager()) != null) {
                                Log.i("CAM", "CAM requeted");
                                Log.i("Thread ID", String.valueOf(Thread.currentThread().getId()));
                                startActivityForResult(intent_record_video, VIDEO_CAPTURE);
//                                reference_this.set_recorded_video(true);
                            }
                        }
                    }).start();
                    return true;
                }
                });

            button_symptoms.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick (View arg_view){
                    Intent intent = new Intent(getApplicationContext(), Loggin_symptoms.class);
                    startActivity(intent);
                }
            });

            button_upload_signs.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick (View arg_view){
                }
            });

            button_measure_heart_rate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick (View arg_view){ finger_on_sensor.setVisibility(View.VISIBLE); }
            });

            button_measure_respiratory_rate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg_view) {
                    SensorManager manager_sensor = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
                    Sensor sensor_accelerometer = manager_sensor.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                    manager_sensor.registerListener(MainActivity.this, sensor_accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
                }
            });
//        }}).start();
    }

    public void setCam(Camera arg_camera) { c = arg_camera; }

    @Override
    public void onSensorChanged(SensorEvent arg_event) {
        float x = arg_event.values[0];
        float y = arg_event.values[1];
        float z = arg_event.values[2];
        Log.i("ACCELEROMETER", String.valueOf(x) + ' ' + String.valueOf(y) + ' ' + String.valueOf(z));
    }

    @Override
    public void onAccuracyChanged(Sensor arg_sensor, int arg_accuracy) {

    }

    @Override
    protected void onPause() {
        super.onPause();
        c.unlock();
//        Log.i("CAM", "unlocked");
//        if (c != null) {
//            c.stopPreview();
////            c.release();
////            c = null;
//        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (c != null) c.lock();
//        if (c != null) {
//            c.stopPreview();
//            c.release();
//            c = null;
///        }
//        cv1 = new CameraView(getApplicationContext(), this);
//       view_camera.addView(cv1);
    }

    @Override
    protected void onDestroy() {
        if (c != null) {
//            c.unlock();
            c.stopPreview();
            c.release();
            c = null;
        }
        super.onDestroy();
    }

    private static class BooleanObject {
        private String name = "BooleanObject";
        private boolean value = false;

        public BooleanObject(String arg_name, boolean arg_value) {
            name = arg_name;
            value = arg_value;
        }

        public String set_name(String arg_name) {
            name = arg_name;
            return name;
        }
        public boolean set_value(boolean arg_value) {
            value = arg_value;
            return value;
        }
        public String get_name() { return name; }
        public boolean get_value() { return value; }
    };

}

2 个线程由线程 ID 的生成解释

每次您点击TextView时,当您使用onTouchListener时,它将被触发两次,一次为ACTION_DOWNACTION_UP ,因此请检查ACTION_UP如下

finger_on_sensor.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch (View arg_view, MotionEvent arg_me){
        if(arg_me.getAction() == MotionEvent.ACTION_UP){ //add this condition
            finger_on_sensor.setVisibility(View.INVISIBLE);
            new Thread(new Runnable() {
            public void run() {
                File file_video = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/video_finger.mp4");
//              final int REQUEST_WRITE_PERMISSION = 786;
                final int VIDEO_CAPTURE = 1;
                StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
                StrictMode.setVmPolicy(builder.build());
                Intent intent_record_video = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                intent_record_video.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 45);
                Uri fileUri = FileProvider.getUriForFile(MainActivity.this, "com.example.cse535a1.provider", file_video);
                intent_record_video.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
                if (intent_record_video.resolveActivity(getPackageManager()) != null) {
                     Log.i("CAM", "CAM requeted");
                     Log.i("Thread ID", String.valueOf(Thread.currentThread().getId()));
                     startActivityForResult(intent_record_video, VIDEO_CAPTURE);
                     //reference_this.set_recorded_video(true);
                 }
              }
         }).start();
         return true;
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM