Android

[8일차] AsncTask

openDatabase 2016. 7. 22. 15:49

실습 


이번에는 핸들러 생성만 

메인스레드에 어떻게 처리하면 좋겠는지 보낼거다. 



mHandler.post를 해서 Runable을 상속받은 메소드 코드로 보낸다. 



반복적인 객체는 msg를 보내고, 다형성을 생각하면 post를 보낸다. 




이런것들을 복잡해 하는 사람들 때문에 AsncTask가 있다. 

이 클래스를 상속받으면 내부에 doinbackground 에서 쓰레드로 실행시켜준다. 




실습은 일단 똑같이 한다. 



안드로이드에서 on 으로 시작되면 거의 main 쓰레드가 호출하는 함수이다. 



중간에 뭔가를 하고 싶으면 

publish ..모 메소드를 호출해서 


onPrexcute() 는 호출 전 세팅할때


onPostExecute() 는 끝나고 호출 됨.


onProgressUpdate함수 불러준다. 



오직 하나의 쓰레드가 나와서 한번에 하나씩 처리 한다. 


api 11에서 는 128개까지 가지고 있는데 그 이후는 오직 한개 이다. 




public class AsncActivity extends AppCompatActivity {
TextView message;
ProgressBar progressbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_asnc);


progressbar = (ProgressBar) findViewById(R.id.progressBar);
message = (TextView) findViewById(R.id.text_message);
Button btn_start = (Button) findViewById(R.id.btn_start);
message.setText("download");
new DownLoadTask().execute("zzz"); // 다운테스크 실행함수



}

class DownLoadTask extends AsyncTask<String, Integer, Boolean>{


@Override
protected void onPreExecute() { // 함수 호출 전 실행하는 메소드
super.onPreExecute();

progressbar.setMax(100);
message.setText("download start...");
}

@Override
protected Boolean doInBackground(String... strings) {
int progress = 0;
while(progress <= 100) {
// progress...
publishProgress(progress);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
progress += 5;
}
return true;
}

@Override
protected void onProgressUpdate(Integer... values) {// 중간에 호출 되는 함수
super.onProgressUpdate(values);
int progress = values[0];
progressbar.setProgress(progress);
message.setText("progress : " + progress);
}

@Override
protected void onPostExecute(Boolean aBoolean) { // 끝나고 호출 되는 함수.
super.onPostExecute(aBoolean);
progressbar.setProgress(100);
message.setText("progress done");
}
}
}