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

HttpClient를 AsyncTask를 이용하여 통신할때. 문의 드립니다.

0 추천

안녕하세요 통신과 테스크 관련해서 문의를 드릴려고 하는데요. 

 

HttpClient를 AsyncTask에 싸서 통신을 요청하는데요. 

 

void aaa(){

MyAsyncTask task = new MyAsyncTask();

task.execute()

????????????????????????????????????????????

여기서.. 통신의 response데이터를 알수 있는 방식이 없을까요??

}

MyAsyncTask extends AsyncTask<String, String, String>{

 

   protected String doInBackground(String... params){
   }

   
   protected void onPostExecute(String result) {
   }

}

 

 

DarkTH (620 포인트) 님이 2013년 11월 14일 질문

2개의 답변

0 추천
없죠

그리 되면 큰 작업 같은 경우 ui 가 lock 되서 화면이 멈추게 되겠죠

보통 dialog 를 띄우고 onPostExecute 로 그 값을 설정하는 방법을 쓰지요

 

해당 위치에서 실행시켜야 하는 특별한 이유라도 있는건가요?
aucd29 (218,390 포인트) 님이 2013년 11월 14일 답변
저희가 라이브러리를 제공을 하는데요.
저희가 제공한 인터페이스내에서 처리해서.
값을 App단으로 리턴처리를 해 줘야 하는 상황이 생겨서

이렇게 밖에 할수가 없었는데요.

이게.. 안드로이드 SDK버전 10이상 되면서 메인 UI스레드에서

통신을 그냥 돌리면 익셉션을 발생시키기 때문에..

내부에서 AsyncTask로 한번 감쌀려고 하거든요..
기능을 interface 로 제공하시면 되겠네요

사용자에게는 setListener 를 받게 하고 listener 가 존재하면 callback 하면 되지요.
최초에 이 방법으로 설계가 되었으면 괜찮은데..
지금 진행이.. 어플단에서.. 진행이 되어버려서..
어플단의 소스를 변경하기가 조금 애매하게 되었습니다.
그래서. 기존에 있는 방식으로 계속 하려고 하다보니..
마땅한 방법이 없는것 같네요.
네 앱단에서도 같이 변경이 필요해 보이네요
네.. 답변 감사드립니다.
앱단만 변경할수 있다면.. 위 방식처럼 진행을 했을텐데.
애초에.. 그렇게 하지 않고. 진행을 해서 오픈이 되다 보니..
현재로써 그 방식을 택할수 없는게. 아쉬울 따름입니다. ㅠ
기능을 그대로 두고 사용자에게 thread 로 감싸서 사용하라고 하면 그대로 나눠도 상관이 없긴 합니다만....ㅎㅎ 정확히 구조를 모르니 어케 이야기를 못 드리겠네요
네네.. 그래서.. 저도.. 개발자들에게.. thread로 감싸서 작업을 해달라고 요청은 하고 있는데...

그 외에는. 제가 수정을 해야 할것 같아서요..

암쪼록 답변 감사합니다.
0 추천
자바의 wait()/notify() 메커니즘을 이용하면 되지 않을까요?

String network_op_sync() {

    Object lock = new Object();

    final String[] network_result = new String[1];    // final 변수 수정을 위해

    new AsyncTask<Void, Void, Void>() {

        @Override String doBackground() {

               network_result[0] =  do_network_op();

               lock.notify();

        }

    }.execute();

    lock.wait();

    return network_result[0];

}
레오나 (3,290 포인트) 님이 2013년 11월 14일 답변
답변 감사드립니다. 일단 먼저 한번 해 봐야 겠네요.
이렇게 사용하면 ui 도 lock 되지 않나요? 가령 버튼에서 call 을 하면 이벤트가 끝나기 전까지 버튼이 계속 눌러져 있는 상태가 되는식으로 말이지요
처음올린 것에서 수정을 좀 했습니다. 생각해보니 onPostExecute()는 메인쓰레드에서 불려 notify()가 제대로 안될 것 같아서요.
그리고,  메인쓰레드에서 wait()을 하는거라서 UI고 뭐고 다 멈추는것 맞습니다. 네트웍 작업이 빠르게 끝날 수 있는 환경에서만 사용해야 합니다. 안그러면 ANR뜨겠죠
...