2012. 8. 20. 17:30

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로 구현하라는데, 이유는 찾아봐야 할것 같다. 

Posted by k1rha