Thread - Handler 방식은 UI 쓰레드와 스케쥴링같은 효과가 안된다.
때문에 asyncTask 로 구현을 해보기로 결정! 잘되면 이어서 포스팅하겟다.
[출처 : http://darrysea.tistory.com/25 ]
메니페스트 파일 입니다.
1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.asynctask"
4 android:versionCode="1"
5 android:versionName="1.0" >
6
7 <uses-sdk android:minSdkVersion="8" />
8
9 <application
10 android:icon="@drawable/ic_launcher"
11 android:label="@string/app_name" >
12 <activity
13 android:configChanges="orientation"
14 android:label="@string/app_name"
15 android:name=".TestAsyncTaskActivity" >
16 <intent-filter >
17 <action android:name="android.intent.action.MAIN" />
18
19 <category android:name="android.intent.category.LAUNCHER" />
20 </intent-filter>
21 </activity>
22 </application>
23
24 </manifest>
가운데 굵게 표시된 부분을 추가해야 한다.
이유는 저렇게 하지 않으면 화면이 회전될때 액티비티가 새로 onCreate를 수행하기 때문에 정상적인 동작이 되지 않는다.
저렇게 해주면 화면모드 전환을 액티비티에서 알아서 하겟다는 의미이다.
main.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <Button
8 android:id="@+id/button1"
9 android:layout_width="match_parent"
10 android:layout_height="wrap_content"
11 android:text="Button" />
12
13 <ProgressBar
14 android:id="@+id/progressBar1"
15 style="?android:attr/progressBarStyleHorizontal"
16 android:layout_width="match_parent"
17 android:layout_height="wrap_content"
18 android:layout_marginTop="100dp" />
19
20 </LinearLayout>
TestAsyncTaskActivity.java
1 package com.asynctask;
2 3 import android.app.*; 4 import android.os.*; 5 import android.view.*; 6 import android.view.View.OnClickListener; 7 import android.widget.*; 8 9 public class TestAsyncTaskActivity extends Activity { 10 11 Button btn; 12 ProgressBar pb; 13 14 /** Called when the activity is first created. */ 15 @Override 16 public void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.main); 19 20 btn = (Button) findViewById(R.id.button1); 21 pb = (ProgressBar) findViewById(R.id.progressBar1); 22 23 btnEvent(); 24 } 25 26 private void btnEvent() { 27 btn.setOnClickListener(new OnClickListener() { 28 29 @Override 30 public void onClick(View v) { 31 new ExampleAsyncTask().execute("1", "2", "3", "4", "5"); 32 } 33 }); 34 } 35 36 class ExampleAsyncTask extends AsyncTask<String, Integer, Long> { 37 38 @Override 39 protected void onCancelled() { 40 super.onCancelled(); 41 } 42 43 @Override 44 protected void onPostExecute(Long result) { 45 btn.setText("Thread END"); 46 super.onPostExecute(result); 47 } 48 49 @Override 50 protected void onPreExecute() { 51 btn.setText("Thread START!!!!"); 52 super.onPreExecute(); 53 } 54 55 @Override 56 protected void onProgressUpdate(Integer... values) { 57 pb.setProgress(values[0]); 58 super.onProgressUpdate(values); 59 } 60 61 @Override 62 protected Long doInBackground(String... params) { 63 long result = 0; 64 int numberOfParams = params.length; 65 66 for (int i = 0; i < numberOfParams; i++) { 67 SystemClock.sleep(1000); 68 69 publishProgress((int) (((i + 1) / (float) numberOfParams) * 100)); 70 } 71 return result; 72 } 73 } 74 }
다 해준다.
하나하나 살펴보자.
메소드 이름도 직관적이라 참 알아보기 쉽다..
39번줄 취소할때 호출되는 Callback이다.
44번줄 작업이 끝난 후 호출 되는 Callback이다.
50번줄 작업이 시작하기 전에 호출 되는 Callback이다.
56번줄 UI Update이다.
62번줄 내부에서 하는 작업이다.
Thread / Handler와의 관계를 보자면,
Thread == 62번줄
Handler == 56번줄 + 44번줄
removeCallback == 39번줄
이라고 생각하면 될 듯 하다.
아 참고로 AsyncTask를 사용 할 때는 항상 SubClass로 구현하라는데, 이유는 찾아봐야 할것 같다.
'Android_Programma' 카테고리의 다른 글
[android] inflater 사용하기 (0) | 2012.09.09 |
---|---|
[Android] 자이로 센서 사용하기 (0) | 2012.09.09 |
[ Android ] [펌] Service 띄워서 알람 띄우기 코드 (0) | 2012.08.03 |
[ Android ] Service 가 떠져 있는지 안떠져 있는지 체크하기 (0) | 2012.08.03 |
[ Android ] Notification 띄우기 (0) | 2012.08.03 |