Category Archives: Android

[Java/Android] Thread를 이용한 특정 작업 수행하기

안드로이드에서 비동기로 특정 작업을 처리하기 위해 간편하게 사용할 수 있는 것으로 AsyncTask가 있습니다. 하지만 그것 이전에 어디서든지 사용할 수 있는 Thread를 이용한 방법에 대해 간단히 정리해 보도록 하겠습니다.

여기서 주의할 점은 처리가 끝나는 시점에서 UI를 변경한다거나 하는 것을 핸들러를 이용하여 처리하는 부분인데요 안드로이드에서는 메인 쓰레드 이외에서 UI에 영향을 끼치는 행위를 거부하고 있습니다. 그렇기 때문에 핸들러를 이용하여 처리를 합니다.

[code]public class ThreadDownloadActivity extends Activity implements OnClickListener
{
    private ProgressDialog mPdProgress;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        // 상태 표시용 프로그래스바
        mPdProgress = new ProgressDialog(this);
        mPdProgress.setMessage(“작업을 수행중입니다.”);
        mPdProgress.setIndeterminate(true);
        mPdProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mPdProgress.setCancelable(false);
       
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
    }
   
  // 이미지 다운로드 결과 표시용 핸들러
    final Handler handler = new Handler()
    {
    public void handleMessage(Message msg)
    {
    mPdProgress.dismiss();
    String message = null;
    switch(msg.what)
    {
case 0:
message = “수행 완료”;
break;

default:
message = “수행 실패”;
break;
}
   
    // 메시지 출력
    Toast.makeText(ThreadDownloadActivity.this, message, Toast.LENGTH_SHORT).show();
    }
    };

@Override
public void onClick(View v)
{
mPdProgress.show();

// 이미지 저장용 쓰레드
   Thread thread = new Thread(new Runnable()
   {
            public void run()
            {
        try
        {
        // 특정 작업을 수행
        // 원래는 이미지 다운로드를 구현해 보려 하였지만 포기;;
        Thread.sleep(2000);
        handler.sendEmptyMessage(0);
        }
        catch(Exception e)
        {
        // 작업이 실패 시
        handler.sendEmptyMessage(1);
        }
            }
        });
        thread.start();
}
}[/code]
위와 같은 코드를 수행해 보면 다음과 같이 잘 동작하는 것을 확인할 수 있습니다.
사용자 삽입 이미지1359710808.zip

[Android] 빠르게 사용할 수 있는 컨텍스트 메뉴(Context Menu)

사용자 삽입 이미지
안드로이드에서 Context Menu의 경우 기본적으로 Long-Touch를 통해 호출되도록 구성되어있습니다. 하지만 간단하게 아이폰의 Picker에 대응하는 것을 구현하려면 방법은 있지만 매우 복잡하고 무언가 이것이 아닌것 같이 꼼수를 부려야만 합니다.

하지만 다음의 방법으로 구현하면 버튼에 클릭이벤트 붙이는 정도의 난이도로 화면을 구현할 수 있습니다.
[code]// AlertDialog를 활용한 다중 선택 메뉴 생성
final String[] items = {“첫번째”, “두번째”, “세번째”, “네번째”};
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(“선택해주세요”);
builder.setItems(items, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText(QuickContextMenuActivity.this,
items[which] + ” 선택!”, Toast.LENGTH_SHORT).show();
}
});
builder.create();

// 클릭 이벤트 생성
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
builder.show();
}
});[/code]

AlertDialog.Builder를 사용하여 컨텍스트 메뉴를 활용했을때와 같은 선택 메뉴를 띄울 수 있습니다. 다음과 같은 화면을 볼 수 있습니다.

사용자 삽입 이미지
1309810891.zip