=================================
=================================
=================================
출처: http://jo.centis1504.net/?p=966
자바의 Swing에서도 마찬가지이지만, 같은 스레드에서 시간이 걸리는 처리를 실행하게 되면 UI가 멈추거나
유져가 입력한 처리를 바로 개시하지 못하는 경우가 많다.
Android에서는 이런 처리들을 AsyncTask 로 정의하여 메인 스레드와 별도로 백그라운드에서 처리한다.
(보통 Thread를 Androind에 최적화하여 Interface를 정의했다고 보면 될듯)
클래스에 지정하는 3개의 Generic의미는
첫번째가 doInBackground 의 인수,
두번째가 progress의 인수,
세번째가 결과(리턴)값의 인수이다.
이렇게 정의하고 실제 호출할때는
SampleAsyncTask task = new SampleAsyncTask(“taskA”);
task.execute((Long)1);
과 같이 백그라운드에서 실행한다.
실행중인지의 체크 방법
=================================
=================================
=================================
출처: http://stackoverflow.com/questions/9671546/asynctask-android-example
public class AsyncTaskActivity extends Activity { Button btn; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button) findViewById(R.id.button1); btn.setOnClickListener((OnClickListener) this); } public void onClick(View view){ new LongOperation().execute(""); } private class LongOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { for(int i=0;i<5;i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } TextView txt = (TextView) findViewById(R.id.output); txt.setText("Executed"); return null; } @Override protected void onPostExecute(String result) { } @Override protected void onPreExecute() { } @Override protected void onProgressUpdate(Void... values) { } } }
=================================
=================================
=================================
출처: http://arabiannight.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAndroid-AsyncTask-%EC%82%AC%EC%9A%A9%EB%B2%95
안드로이드/Android AsyncTask 사용법
안드로이드 AsyncTask 사용법에 대해 알아 보겠습니다. 안드로이드에는 UI 를 총괄하는 메인Thread가 존재 한고 있는데요.([안드로이드/Android Android에서 Thread(쓰레드) 란 무엇 인가?]) 메인Thread 외에는 일반Thread들이 안드로이드 UI 화면을 처리할 수 없습니다. 그렇기 때문에 메인Thread와 일반Thread 를 잘 핸들링 해서 사용해야 하는데, 여간 번거로운 일이 아닙니다.
그렇기 때문에, Android 에서는 AsyncTask 라는 객체를 지원하는데요. AsyncTask는 UI 처리 및 Background 작업 등 을 하나의 클래스에서 작업 할 수 있게 지원해 줍니다. 쉽게말해 메인Thread와 일반Thread를 가지고 Handler를 사용하여 핸들링하지 않아도 AsyncTask 객체하나로 편하게 UI를 수정 할 수 있고, Background 작업을 진행 할 수 있습니다. 각각의 주기마다 CallBack 메서드를 사용해서 말이죠.
큰 장점입니다.
자 그럼 예제 소스를 살펴 볼까요?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package arabiannight.tistory.com.aynctask; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; public class TestAsyncTaskActivity extends Activity { private MyAsyncTask myAsyncTask; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); myAsyncTask = new MyAsyncTask(); myAsyncTask.execute( "80" , "90" , "100" , "110" ); } // AsyncTask클래스는 항상 Subclassing 해서 사용 해야 함. // 사용 자료형은 // background 작업에 사용할 data의 자료형: String 형 // background 작업 진행 표시를 위해 사용할 인자: Integer형 // background 작업의 결과를 표현할 자료형: Long // 인자를 사용하지 않은 경우 Void Type 으로 지정. public class MyAsyncTask extends AsyncTask<string, void ,= "" string= "" > { @Override protected void onPreExecute() { super .onPreExecute(); } @Override protected String doInBackground(String... params) { String sum = "" ; if (params != null ){ for (String s : params){ sum += s; } } return sum; } @Override protected void onPostExecute(String result) { super .onPostExecute(result); if (result != null ){ Log.d( "ASYNC" , "result = " + result); } } @Override protected void onCancelled() { super .onCancelled(); } } } //</string,> |
1. onPreExecute() : Background 작업 시작전에 UI 작업을 진행 한다.
@Override protected void onPreExecute() { super.onPreExecute(); } |
2. doInBackground() : Background 작업을 진행 한다.
@Override protected String doInBackground(String... params) { super.onPreExecute(); } |
3. onPostExecute() : Background 작업이 끝난 후 UI 작업을 진행 한다.
@Override protected void onPostExecute(String result) { super.onPreExecute(); } |
FLOW를 살펴 보자면,
[onPreExecute()] -> [doInBackground()] -> [
onPostExecute()] 순서가 됩니다.
=================================
=================================
=================================
출처: http://daehyub71.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAsyncTask%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC
=================================
=================================
=================================
출처: http://ismydream.tistory.com/130
안드로이드 비동기 처리하기 AsyncTask
비동기 처리를 하기 위해서는 별도의 Thread 를 생성하여 public void run() 메소드를 구현하면 되지만 안드로이드에서는 직접 Thread 를 생성하기 보다는 AsyncTask 를 사용하길 권장합니다.
AsyncTask 내부에는 자체 ThreadPool 이 있어 Thread 가 무한정 늘어나 메모리에 부담을 주지 않도록 관리 하고 있기 때문에따로 ThreadPool 을 관리하지 않는다면 AsyncTask 를 사용하는게 무난할 것 같습니다.
아래는 비동기적으로 ImageView에 Bitmap을 로드하는 코드입니다.
doInBackground 메소드는 기존의 Thread 에서의 run() 메소드라고 보시면 됩니다.
AsyncTask 는 처리할 데이터에 따라 파라미터 타입을 정의할 수 있습니다. 정의하는 부분은 클래스를 정의하는 부분에 있습니다.
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap>{
Integer | execute, doInBackground 의 파라미터 타입 |
Void | onProgressUpdate 의 파라미터 타입 |
Bitmap | doInBackground 의 리턴값, onPostExecute 의 파라미터로 설정됩니다. |
AsyncTask 소스를 보면 좀더 정확히 확인하실 수 있습니다.
또한 AsyncTask 는 실행 전후로 전처리, 후처리를 할 수 있는 콜백 메소드를 제공합니다.
onPreExecute(), onPostExecute( Bitmap)
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap>{
private final WeakReference<ImageView> imageViewReference;
private int data = 0;
public BitmapWorkerTask( ImageView imageView){
// WeakReference 를 사용하는 이유는 image 처럼 메모리를 많이 차지하는 객체에 대한 가비지컬렉터를 보장하기 위해서입니다.
imageViewReference = new WeakReference<ImageView>(imageView);
}
@Override
protected Bitmap doInBackground( Integer... params){
data = param[0];
return decodeSampledBitmapFromResource( getResources(), data, 100, 100);
}
@Override
protected void onPostExecute( Bitmap bitmap){
if( imageReference != null && bitmap != null){
final ImageViewReference imageView = imageViewReference.get();
if( imageView != null){
imageView.setImageBitmap( bitmap);
}
}
}
}
위처럼 AsyncTask 를 확장하는 클래스를 생성한후 실행하면 됩니다.
public void loadBitmap( int resId, ImageView imageView){
BitmapWorkerTask task = new BitmapWorkerTask( imageView);
task.execute( resId);
}
AsyncTask 는 execute( Runnable) 메소드도 제공하기 때문에 별도의 스레드 작업을 할때도 사용할 수 있습니다.
[별도의 카메라 앱을 실행시켜 사진을 촬영하는 코드]
AsyncTask.execute( new Runnable(){
public void run() {
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
try{
mImageF = createImageFile();
// 이미지가 저장될 파일은 카메라 앱이 구동되기 전에 세팅해서 넘겨준다.
openCameraIntent.putExtra( MediaStore.EXTRA_OUTPUT, Uri.fromFile( mImageF));
mActivity.startActivityForResult( openCameraIntent, RequestCodes.REQUESTCODE_CAMERA_PICTURE);
}catch( IOException e){
e.printStackTrace();
}
}
});
=================================
=================================
=================================
댓글 영역