백그라운드에서 AsyncTask 로 thread를 하는데요
for(int i = 0; i < 8; i++){
Thread.sleep(5*1000);
}
한 40초간 기달려랴하는 작업이 있기때문에 asynctask에서 이런식으로 시간을 지연하였는데
메인엑티비티에 anr이 걸리는데요
1.asynctask는 쓰레드이기 때문에 메인의 동작에 asynctask가 영향을 주어 anr이 발생하는게 맞는건가요?
2.이걸 방지할려고 한다면 thread 안에서 asyntask를 태우는 방법으로 한다면 anr에 도움이 될런지요??
whylee님 말씀처럼 AsyncTask클래스는 UI 스레드에서 excute하면 후에 AsyncTask 내부에서 일어나는 이벤트에 대해
UI스레드에서 호출되는 콜백 메서드들이 있습니다.
그 메서드에서 시간 지연작업을 하시게 되면 UI스레드 에서 호출한 메서드가 해당 시간동안 리턴하지 못해서 ANR이 걸리게 됩니다.
doInBackground(), publishProgress() 에서 지연작업을 하세요
답변 감사합니다.
onPreExecute
doInBackground
onPostExecute
에 어떻게 동작하는지는 알고 있습니다.
ui에 어떤 리턴값을 줘야하는 작업은 아니지만
thread를 태워야하는데 asynctask가 쓰레드가 편하다고 해서 이걸로 결정해서 하고있는데요
doinbackground안에 {
abc.startMethoud();
}
abc클래스의 static startMethoud 메소드를 호출하였고 이 startmethod안에 사실은 thread.sleep을 주었는데요 (40초)
40초를 하꺼번에 주면 대기하다가 죽기때문에 5초마다 포문으로 돌린거구요
thread.sleep을 메소드 안에다 넣지 말고 그렇타면
doinbackground{
for(int i = 0; i<8; i++) thread.sleep(5000);
abc.startMethoud();
}
이렇게 하면 메인엑티비티가 탭으로 이동해도
asynctask는 알아서 쓰레드 동작을 한다는 것인가요??
아니면
한 엑티비티에서 asynctask 태우면 그 엑티비티는 asynctask의 작업이 끝날때까지 다른엑티비티로 이동을 못하는건게 맞는건가요??
doInBackground가 백그라운드 쓰레드에서 돌아가는 것입니다. 여기다 기다리는 작업을 넣어야 합니다.
onPreExecute 나 onPostExecute는 UI쓰레드에서 돌아가는 것이므로 기다리는 작업을 넣으면 안됩니다.
보통 기다리는 작업이나 네트워크 작업을 할때
onPreExecute에서 프로그래스 UI띄우는 작업을 넣고,
doInBackground 에서 작업을 하고, 다 끝나면
onPostExecute에서 프로그래스 UI를 숨기는 등 나머지 작업을 합니다.