">

AsyncTask 쉬운 따라하기



public class MainActivity extends AppCompatActivity {
ProgressBar progressBar;
TextView textView;
Button button;
Async async;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar)findViewById(R.id.progressBar);
textView = (TextView)findViewById(R.id.textView_result);
button = (Button)findViewById(R.id.btn_stop);


async = new Async();
async.execute(0, 100);

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
async.cancel(false);
}
});
}


// 첫 번째 인자는 doInBackground, 두 번째는 onProgressUpdate,
// 세 번째는 onPostExecute와 onCancelled에 사용됨
private class Async extends AsyncTask<Integer, Integer, Integer>{
@Override
protected Integer doInBackground(Integer... params) {
int i = params[0];
int j = params[1];

while(i < 100 && !isCancelled()) { // isCancelled는 중간에 cancel 했는지 확인하기 위해 사용
Log.d("Test", String.valueOf(i));
publishProgress(i, j);
i++;
j--;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return i;
}

// 가장 먼저 실행 됨
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d("Test", "============== Pre Execute =============");
}

// doInBackground에서 작업이 모두 마치면 실행 됨
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);

textView.setText(String.valueOf(integer));
}

// doInBackground에서 호출하면 실행 됨
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.d("Test", "============== onProgressUpdate ==============");
Log.d("Test", "Progress: " + String.valueOf(values[0]) + " " + String.valueOf(values[1]));
progressBar.setProgress(values[0]);
textView.setText(String.valueOf(values[0]));
}

// cancel 호출하면 실행 됨
@Override
protected void onCancelled(Integer integer) {
super.onCancelled(integer);
Log.d("Test", "============== onCancelled value: " + integer + "============");
}

// cancel 호출하면 실행 됨
@Override
protected void onCancelled() {
super.onCancelled();
Log.d("Test", "============== onCancelled ==================");
}
}
}


주석만 대충 읽어봐도 흐름은 눈에 보일 것이다. onProgressUpdate와 onPostExecute에서 UI 작업을 하면 된다. 

차이점은 onProgressUpdate에서는 스레드가 동작하는 동안 계속 UI를 변경 시킬 수 있고, onPostExecute는 

스레드가 종료된 이후 UI를 변경한다는 점이다. 


doInBackground 메서드 안의 while문에서 isCancelled 메서드를 통해 스레드가 cancel 됐는지를 계속 확인한다.

AsyncTask를 즉각 멈추기 위해서 사용하는 것이다. 

이런 확인 과정이 없으면 AsyncTask를 중간에 종료해도 while문은 조건이 틀릴때 까지 계속 동작한다. 



'프로그래밍 > Android' 카테고리의 다른 글

Viewpager 쉽게 만들어 보자  (0) 2017.05.25
탭(Tab) 쉽게 만들어 보자  (2) 2017.05.19
Retrofit 단순 예제  (0) 2017.05.11
Preference  (0) 2017.05.08
리스트뷰 아이템 내용 가져오기  (0) 2017.03.21

+ Recent posts