note

Handler 사용하기 (로딩 표시?) 본문

Android/기본

Handler 사용하기 (로딩 표시?)

투한 2012. 1. 11. 17:10

기존 이미지



수정된 이미지(코드를 더 추가하여 Progress몇개더 구현함

막대의 형태의 progress 


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- 막대바 형식의 progress -->
    <ProgressBar android:id="@+id/progress"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal" />
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleLarge" />
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleSmall" />

</LinearLayout>


package com.commonsware.android.threads;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ProgressBar;

public class HandlerDemo extends Activity {
	ProgressBar bar;
	//백그라운드 작업을 하고 있는 Thread 객체가 데이터를 Message에 담아서
	//전달 받으면 해당메세지로 부터 데이터 추출해서 Activity의 View전달하는 역할
	Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg){
			bar.incrementProgressBy(5);
		}
	};
	boolean isRunning=false;
	
	//Activity 생명주기
	//onCreate메소드 -> onStart메소드 -> onResume메소드 -> 화면 display
	//화면이 가려질 때는 onPause 메소드 -> onStop메소드
	//화면이 가려졌다 다시 display 될때 onRestart메소드 -> onStart메소드 -> onResume메소드  -> 화면 display
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		bar=(ProgressBar)findViewById(R.id.progress);
	}
	public void onStart(){
		super.onStart();
		bar.setProgress(0); //Progressbar 초기화

		Thread background=new Thread(new Runnable() {
			public void run(){
				try{
					for (int i=0; i<20 && isRunning; i++){
						Thread.sleep(1000);
						handler.sendMessage(handler.obtainMessage());
					}
				}
				catch(Throwable t){
					//오류가 발생하면 백그라운드 스레드를 그대로 종료한다
				}
			}
		});
		
		isRunning=true;
		background.start();
	}
	public void onStop(){
		super.onStop();
		isRunning=false;
	}
}