Vishwad
Vishwad

Reputation: 231

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

I am new to Java coding for android. I need to understand why does my code generate 2 threads. The problem that can be created over here is perhaps competition for Camera Resources which results in the camera not being used by the user. Kindly suggest a solution to my problem as well.

I have also attached a picture where there are 2 requests for a new activity. There is also proof by having 2 thread IDs active.

EDIT for clarity: I want to generate a new thread which solely handles the activity to record the video, no other thread should be doing it. But there are two that are performing their own activity to record video.

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 threads explained by generation of thread ID

Upvotes: 0

Views: 45

Answers (1)

Rajan Kali
Rajan Kali

Reputation: 12953

Every time you tap on TextView, as you are using onTouchListener, it will be fired twice, once for ACTION_DOWN and ACTION_UP, so check for ACTION_UP as in

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;
    }
});

Upvotes: 1

Related Questions