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

AsyncTask 콜백 질문드립니다!

0 추천

코드이미지

AsyncTask를 상속받은 GetDB 클래스입니다.

task.execute 를 실행하여 DB에서 GetDB 내부 ArrayList로 데이터를 받아옵니다. 

받아온 ArrayList를 메인에서 선언된  ArrayList로 옮기는데 

execute 바로 밑 Log지점에서 ArrayList를 사용하게 됩니다.

 이 경우에는 아직 값을 받아오지 못하여서 빈 값이 뜨는 상황입니다. 여러 글들을 참조하여보니 postExecute에서 콜백 메세지를 보내라는 말들이 있는데 정확하게 어떻게 task의 종료 시점을 메인에서 어떻게 받을지 잘 모르겠습니다 ㅠ.. 

아직 많이 부족한 학생입니다. 선배님들의 답변 부탁드리겠습니다.  감사합니다.

NLPLAB235 (140 포인트) 님이 2020년 11월 5일 질문

1개의 답변

0 추천
GetDB AsynTask의 구현 내용에 따라 해결책이 달라집니다.

AsynTask는 Main thread(onClick() 함수)와 동시에 수행되므로

절대 execute()함수 아래에서 결과 값을 받아 볼 수 없습니다.

GetDB class에서 작업 완료를 알려주는 callback이나 message 전송부를 가지고 있어야 합니다.
디자이너정 (42,810 포인트) 님이 2020년 11월 5일 답변
AsyncTask와 관련해서 두가지 알아 두셔야 할 것은,
향후에 직업적으로 안드로이드 개발을 하실 생각이시라면, 아래를 잘 읽어보세요.
https://developer.android.com/reference/android/os/AsyncTask
Android11부터 AsyncTask는 deprecated 되었습니다. 쉽게 말하면 1년 후부터는 더이상 사용하면 안된다고 보시면 됩니다.
두번째는 쓰레드의 전환에 관해서입니다. 이건 비단 AsyncTask만에 해당되는 것이 아니라 모든 프로그래밍의 쓰레드 전환과도 관련이 있습니다. AsyncTask는 execute()를 하게되면 onPreExecute() - 메인쓰레드
onProgressUpdate() - 메인쓰레드
doInBackground() - 백그라운드 쓰레드
onPostExecute() - 메인쓰레드
아시다 시피 화면을 그릴 때 쓰는 쓰레드는 메인(UI) 쓰레드입니다. 따라서 JSON 파싱, 연산 등의 작업은 백그라운드 작업에 위치시키고 화면을 업데이트 하는 부분만 메인쓰레드로 위치시키는게 성능상 더 좋을 겁니다. 이점은 RxJava나 Coroutine을 사용하더라도 동일합니다.
댓글 감사합니다.
한가지 질문 더 드리자면 ㅠㅠ
지금 위 링크를 참고하여 onComplete(?) 을 통하여 해결 하였는데
########################################################
GetDB task = new GetDB(new GetDB.OnResultListener(){
                    @Override
                    public void onComplete(boolean result) {
                        if(!result){/* Task통해 받아온 부분 프론트앤드에서 사용하는부분
                            ListAdapter adapter = new SimpleAdapter(
                                    activity, MainActivity.mArrayList, R.layout.item_list,
                                    new String[]{"id","name","country"},
                                    new int[]{R.id.textView_list_id, R.id.textView_list_name, R.id.textView_list_address}
                            );

                            mlistView.setAdapter(adapter);
                            Log.d("yeongrak", String.valueOf(mArrayList.size()));
                            */
                        }
                    }
                },activity,10);
                task.execute("http://~~~~~//getjson.php", input1, input2);
###################################################
GetDB 클래스 내부에 onResultlistener를 구현하여 해결은 했는데 콜백 메세지라 함은 이러한 방식이 맞을까요 .. ? 서버 사용을 처음해보는 학생이라,
서버에서 값을 가져오고 끝이 아니고, 다른 작업을 해야하는 경우에는 AsyncTask가 아닌 Thread로 구현을 하여야 맞는거였나요 ?!   댓글 감사합니다
기본형태는 맞구요.
public void onComplete(boolean result)
부분에  boolean 대신 결과 리스트가 포함된 형태를 받으셔야 SimpleAdapter를 데이터를 전달하실 수 있을 것 같은데요.

public class GetDBResult {
     private final boolean success;
     private final String errorMessage;
     private final List<ObjectYouWant> data;

     public GetDBResult(boolean success, String errorMessage, List<ObjectYouWant> data) {
          this.success = success;
          this.errorMessage = errorMessage;
          this.data = data;
     }

     //getter 생략. setter는 필요없음.
}

public void onComplete(GetDBResult result) {
      if (!result.success) {
          showErrorMessage(result.errorMessage);
          return;
      }

      updateListAdapter(result.data);
}
...