마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

현재 사용하는 쓰레드를 종료하려고 합니다.

0 추천
package com.example.led_vlc;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {
 private Camera camera;
 private final Context context = this;
 
 class LightThread extends Thread {
  final Parameters p = camera.getParameters();
  int num;
  
  public void num(int i){
   num = i;
  }
  
  public void run() {
   int i, j;
   for (i=0; i<10; i++) {
    for(j=0; j<10; j++){
     if(j<num) {
      p.setFlashMode(Parameters.FLASH_MODE_TORCH);
      camera.setParameters(p);
      camera.startPreview();
      Log.i("info", "torch is turn on!");
     }
     else {
      p.setFlashMode(Parameters.FLASH_MODE_OFF);
      camera.setParameters(p);
      camera.stopPreview();
      Log.i("info", "torch is turn off!");
     }
     SystemClock.sleep(50);
    }
   }
  }
 }

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  final PackageManager pm = context.getPackageManager();
  if (!isCameraSupported(pm)) {
   AlertDialog alertDialog = new AlertDialog.Builder(context).create();
   alertDialog.setTitle("No Camera");
   alertDialog.setMessage("The device's doesn't support camera.");
   alertDialog.setButton(RESULT_OK, "OK",
     new DialogInterface.OnClickListener() {
      public void onClick(final DialogInterface dialog,
        final int which) {
       Log.e("err", "The device's doesn't support camera.");
      }
     });
   alertDialog.show();
  }
  camera = Camera.open();
 }
 public void OnButtonClicked(View view)
 {
  PackageManager pm = context.getPackageManager();
  LightThread LT = new LightThread ();
  
  if(LT != null) {
   LT.interrupt();
   Log.i("info", "먼춰라 멈춰라 제발 멈춰");
  }
  Log.i("info", "여기는??");
  if (isFlashSupported(pm)) {
   switch(view.getId()) {
   case R.id.button1:
    LT.num(1);
    LT.start();

    break;
   case R.id.button2:
    LT.num(2);   
    LT.start();
    
    break;
   case R.id.button3:
    LT.num(3);   
    LT.start();
    break;
   case R.id.button4:
    LT.num(4);   
    LT.start();
    break;
   case R.id.button5:
    LT.num(5);   
    LT.start();
    break;
   case R.id.button6:
    LT.num(6);   
    LT.start();
    break;
   case R.id.button7:
    LT.num(7);   
    LT.start();
    break;
   case R.id.button8:
    LT.num(8);   
    LT.start();
    break;
   case R.id.button9:
     
    break;
   }   
  }
  else {
   AlertDialog alertDialog = new AlertDialog.Builder(context).create();
   alertDialog.setTitle("No Camera Flash");
   alertDialog
     .setMessage("The device's camera doesn't support flash.");
   alertDialog.setButton(RESULT_OK, "OK",
     new DialogInterface.OnClickListener() {
      public void onClick(final DialogInterface dialog,
        final int which) {
       Log.e("err",
         "The device's camera doesn't support flash.");
      }
     });
   alertDialog.show();
  }
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // Handle action bar item clicks here. The action bar will
  // automatically handle clicks on the Home/Up button, so long
  // as you specify a parent activity in AndroidManifest.xml.
  int id = item.getItemId();
  if (id == R.id.action_settings) {
   return true;
  }
  return super.onOptionsItemSelected(item);
 }
 
 private boolean isFlashSupported(PackageManager packageManager) {
  // TODO Auto-generated method stub
  if (packageManager
    .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
   return true;
  }
  return false;
 }

 private boolean isCameraSupported(PackageManager packageManager) {
  // TODO Auto-generated method stub
  if (packageManager
    .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
   return true;
  }
  return false;
 }
}

안녕하세요

후방카메라 flash의 깜빡임을 제어 하기 위한 안드로이드 앱을 만들고 있습니다.

8개의 버튼을 사용해 서로 다른 주기의 깜빡임을 주고 있습니다.

그런데 1번 버튼을 누르고 2번 버튼을 누르면 1번이 죽고 2번으로 깜빡임이 나와야 되는게 정상인데

두가지 깜빡임이 동시에 나타나고 있습니다.

이것저것 알아보니 thread.join(), thread.interrupt() 함수를 사용해서 쓰레드를 종료할 수 있다고 하는데

도저히 코드를 고쳐봐도 종료 되지가 않습니다.

위의 코드를 어떻게 바꾸면 제대로 동작을 할까요...ㅠㅠ

부탁드리겠습니다.

 

이상헌 (140 포인트) 님이 2014년 9월 16일 질문

1개의 답변

0 추천
스레드에 대해 더 공부하시기 바랍니다.

Thread.interrupt() 는 스레드를 종료하는게 아니라 종료 요청을 하는 함수입니다.

Thread.run() 함수에서 종료요청을 받았을 때 실제로 종료하게 처리하여야 합니다.
익명사용자 님이 2014년 9월 16일 답변
...