마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AsyncTask 내부에서의 ui 변환.

0 추천
안녕하세요.

AsyncTask로 최소 한 번~20번 정도로 다이얼로그 ui를 바꾸는 작업을 하고있습니다.

현재 구조는

onPreExecute에서 해당 다이얼로그를 선언 및 기본문구 셋팅,

doInBackground에서 for문으로 1에서 20번 정도[가변적임] 반복합니다.

onPostExecute에서는 마무리를 하구요.

 

원래 doInBackground에서 ui를 변환하면 안된다는걸 아는데...

5.0이상에서 doInBackground내부에서 강제로 다음과 같이 스레드를 돌리면 이상이 없는데,

 runOnUiThread(new Runnable() {

                    public void run() {

                    mDlg.setMessage(출력할내용);

                    }

                });

4.4.2와 같은 킷캣에서는 메인스레드 오류가 발생합니다.

os버전차이때문에 그런건지 몰라도..사실 강제로 스레드를 돌리는 것도 불안정해보여서

방법을 개선하려고 하는데요.

doInBackground에서 n번 반복하지 말고, asynkTask를 n번 반복해야할까요..?

현재:onpre - doin[n번반복] - onpost로 끝

=>다이얼로그 dismiss 없이 매끄럽게(?) 반복되어서 사용중.

수정:onpre - doin - onpost =>n번 반복.
=>이렇게 수정하면 문제는 없겠지만, 반복할 경우 다이얼로그 열고닫힘이 보여서

다이얼로그 ui를 어떻게 해야할지 궁금.
 

조언 좀 주시면 감사하겠습니다..
하핫 님이 2017년 11월 27일 질문

2개의 답변

0 추천

Handler로 굳이 Runnable을 전송하는 것이 아니라 message를 전송하는 방식도 있습니다.

UI 스레드에서 Handler의 message에 대한 처리를 해주시면 될 것 같습니다.

 
minor (13,710 포인트) 님이 2017년 11월 27일 답변
0 추천
AsyncTask에서 작업 중간 값을 UI에 반영하기 위한 메서드를 제공하는데요. onProgressUpdate 메서드입니다. 아래 링크에서 확인해 보세요.

결과로 onpre -> doIn -> onprogress -> onpost(doIn 끝) 의 과정으로 처리하시면 됩니다.

https://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)
mcsong (44,040 포인트) 님이 2017년 11월 28일 답변
...