상세 컨텐츠

본문 제목

[Android]단일 스레드 모델

Android 개발

by mobile 2013. 9. 19. 23:19

본문

반응형

단일 스레드 모델이란 시스템내에서 해당 작업 또는 해당 기능을 사용하는 시점에는 반드시 하나의 스레드만 실행되어야 한다는 특징을 갖는 메서드를 말한다. 이러한 기능을 갖는 메서드나 기능들을 전문 용어로 'Thread-Unsafe'라 한다. 그리고 여러 스레드에서 동시에 멀티 태스킹으로 사용할 수 있는 메서드나 기능을 'Thread-Safe'라 부른다.


"화면 구현과 관련된 클래스나 메서드 가운데 Thread-Unsafe 인 클래스와 메서드들에 대해서만 반드시 메인 스레드 또는 핸들러에서 구현해야 한다." 또한 다이얼로그는 핸들러를 사용하여 다이얼로그에서 제공하는 메서드들은 'Thread-Safe'로 만든다는 사실이다.



package com.android.example;


import android.app.Activity;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.content.DialogInterface;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.os.SystemClock;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;


public class ProgressBar extends Activity {

    private static final int DIALOG_UIDIRECT = 1;

    private static final int DIALOG_UITHREAD = 2;

    private static final int DIALOG_HANDLER = 3;


    private static final int MAX_PROGRESS = 100;


    private ProgressDialog mProgressDialog;

    private ProgressDialog TProgressDialog;

    private ProgressDialog HProgressDialog;

    private int mProgress;

TextView textResult;

private Handler mProgressHandler, mHandler;


    @Override

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

                

        textResult = (TextView)findViewById(R.id.Example);

        Button ViewPostButton = (Button) findViewById(R.id.UiDirect);

        Button UiThreadButton =(Button)findViewById(R.id.UiThread);

Button UiHandlerButton=(Button)findViewById(R.id.UiHandler);


        mHandler = new Handler();

        

        ViewPostButton.setOnClickListener(new OnClickListener() {

            @Override

public void onClick(View v) {

                showDialog(DIALOG_UIDIRECT);

                new Thread(new Runnable() {

                @Override

public void run() {

                // exception 발생.

                // textResult.setText("UI 작업 테스트 중...");

                // post() 메서드 사용.

                // 결과적으로 뷰 클래스의 post() 메서드나 핸들러 클래스에서 제공하는 post() 메서드는 동일.

                // textResult.post(new Runnable() {

                        mHandler.post(new Runnable() {

                        @Override

        public void run() {

                        textResult.setText("UI 작업 테스트 중... ");

                        }

                });

                for(mProgress = 0; mProgress<=MAX_PROGRESS; mProgress+=1) {

mProgressDialog.setProgress(mProgress);

               

                SystemClock.sleep(100);

                }

                        mProgressDialog.dismiss();

                }

                }).start();

            }

        });


        UiThreadButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

showDialog(DIALOG_UITHREAD);

           new Thread(new Runnable() {

              @Override

public void run() {

                 for(mProgress = 0; mProgress<=MAX_PROGRESS; mProgress+=1) {

                  // 일반 스레드에서 메인 스레드와 연결하여 실행시키는 메서드.

              runOnUiThread(new Runnable() {

          //mHandler.post(new Runnable() {

              @Override

public void run() {

                          // textResult.setText("runOnUiThread UI 작업 테스트 중...");

              TProgressDialog.setProgress(mProgress);

              }

              });

            SystemClock.sleep(100);

              }

                   TProgressDialog.dismiss();

              }  

              /* runOnUiThread(new Runnable() {

              // mHandler.post(new Runnable() {

                    @Override

                    public void run() {

            showDialog(DIALOG_UITHREAD);

                         for(mProgress = 0; mProgress<=MAX_PROGRESS; mProgress+=1) {

                          TProgressDialog.setProgress(mProgress);


                          SystemClock.sleep(100);

                       }

                           TProgressDialog.dismiss();

                       }

                   });

          } */

           }).start(); 

});


        UiHandlerButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

showDialog(DIALOG_HANDLER);

                new Thread(new Runnable() {

                @Override

public void run() {

                mProgress = 0;

                HProgressDialog.setProgress(0);

                mProgressHandler.sendEmptyMessage(0);

                }

                }).start();

            }

});


        mProgressHandler = new Handler() {

            @Override

            public void handleMessage(Message msg) {

                super.handleMessage(msg);

                if (mProgress >= MAX_PROGRESS) {

                    HProgressDialog.dismiss();

                } else {

                    mProgress++;

                    HProgressDialog.incrementProgressBy(1);

                    mProgressHandler.sendEmptyMessageDelayed(0, 100);

                } 

            } 

        };

    }

    

    @Override

    protected Dialog onCreateDialog(int id) {

        switch (id) {

        case DIALOG_UIDIRECT:

        mProgressDialog = new ProgressDialog(ProgressBar.this);

            mProgressDialog.setIcon(android.R.drawable.ic_dialog_alert);

            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

            mProgressDialog.setMax(MAX_PROGRESS);

            mProgressDialog.setButton(getText(R.string.alert_dialog_hide), 

                             new DialogInterface.OnClickListener() {

                @Override

public void onClick(DialogInterface dialog, int whichButton) {

                  }

            });

            mProgressDialog.setButton2(getText(R.string.alert_dialog_cancel), 

                             new DialogInterface.OnClickListener() {

                @Override

public void onClick(DialogInterface dialog, int whichButton) {

                  

                }

            });

            mProgressDialog.setTitle("UI 작업 테스트 중...");

            return mProgressDialog;

     

        case DIALOG_UITHREAD:

        TProgressDialog = new ProgressDialog(ProgressBar.this);

            TProgressDialog.setIcon(android.R.drawable.ic_dialog_alert);

            TProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

            TProgressDialog.setMax(MAX_PROGRESS);

            TProgressDialog.setButton(getText(R.string.alert_dialog_hide), 

                             new DialogInterface.OnClickListener() {

                @Override

public void onClick(DialogInterface dialog, int whichButton) {

                }

            });

            TProgressDialog.setButton2(getText(R.string.alert_dialog_cancel), 

                             new DialogInterface.OnClickListener() {

                @Override

public void onClick(DialogInterface dialog, int whichButton) {

                }

            });

            TProgressDialog.setTitle("runOnUiThread 작업 테스트 중...");

            return TProgressDialog;

   

        case DIALOG_HANDLER:

        HProgressDialog = new ProgressDialog(ProgressBar.this);

            HProgressDialog.setIcon(android.R.drawable.ic_dialog_alert);

            HProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

            HProgressDialog.setMax(MAX_PROGRESS);

            HProgressDialog.setButton(getText(R.string.alert_dialog_hide), 

                             new DialogInterface.OnClickListener() {

                @Override

public void onClick(DialogInterface dialog, int whichButton) {

               

                 }

            });

            HProgressDialog.setButton2(getText(R.string.alert_dialog_cancel), 

                             new DialogInterface.OnClickListener() {

                @Override

public void onClick(DialogInterface dialog, int whichButton) {

                }

            });

            HProgressDialog.setTitle("Handler 작업 테스트 중...");

            return HProgressDialog;

        default:    

        return null;

        }

    }

}


반응형

'Android 개발' 카테고리의 다른 글

[Android]내부 바인드 서비스  (0) 2013.09.21
[Android]서비스 - 01  (0) 2013.09.20
[Android]안드로이드 스레드 구현시 주의 사항  (0) 2013.09.19
[Android]핸들러 클래스  (0) 2013.09.19
[Android]스레드 구현  (0) 2013.09.18

관련글 더보기

댓글 영역