안드로이드 개발 질문/답변
(글 수 45,052)
결과 리턴이 오래걸리는 서비스(aidl)는 asynctask를 사용하면 되나요?
제가 구현한 서비스는 다른 어플들과 통신을 통해서 결과값을 내뱉는 모듈인데요. 이 결과를 리턴하는게 좀 오래걸려요.
그래서 이 서비스를 바인드한 엑티비티에서 이서비스의 모듈을 사용하면 결과가 다처리될동안 멈추었다가 실행되거든요.
사용하는 부분에다가 thread를 사용해봤는데 계속 ANR을 내뱉어서;; asynctask를 구현한다음에 거기서 사용하면 ANR 안뱉을까요?;;
전문가님들의 조언을 부탁드립니다. ^^;
제가 구현한 서비스는 다른 어플들과 통신을 통해서 결과값을 내뱉는 모듈인데요. 이 결과를 리턴하는게 좀 오래걸려요.
그래서 이 서비스를 바인드한 엑티비티에서 이서비스의 모듈을 사용하면 결과가 다처리될동안 멈추었다가 실행되거든요.
사용하는 부분에다가 thread를 사용해봤는데 계속 ANR을 내뱉어서;; asynctask를 구현한다음에 거기서 사용하면 ANR 안뱉을까요?;;
전문가님들의 조언을 부탁드립니다. ^^;
2011.01.26 13:59:31
interface OnResultListener {
void onResult(boolean result);
}
형식으로 리스너 하나 정의하시고
doBackUp(OnResultListener l) 로 요청하시면서 같이 넘기시면 될것 같은데요.
미디어 스캐너쪽에서 이런 형식으로 많이 쓰거든요.
(자세한 사항은 첨부 참고..)
귀찮으시면 Intent에 putExtra로 결과넣어서 sendBroadcast하고 Activity에서 BroadcastReciever로 받는 방법도 있구요.
어떤 형식으로 하든 결과가 늦게 나오는 것이니 ANR을 피하려면
요청하는 쪽과 결과를 보내는 부분을 분리해야 할것 같습니다.
2011.01.26 14:38:15
정말 친절하고 자세한 설명 정말 감사합니다 ^^
꼬리에 꼬리는 무는 질문이겠지만 죄송하게도 또 질문하게됬네요 ^^;
=====ResultListener.aidl=====
oneway interface ResultListener {
void onResult(boolean result);
}
=====BackUpInterface.aidl=====
interface BackUpInterface{
boolean doBackUp(in ResultListener listener);
}
이렇게 했는데 아래BackUpInterface.aidl 에서 ResultListener 가 선언되지 않았다고 하네요; ㅠ
꼬리에 꼬리는 무는 질문이겠지만 죄송하게도 또 질문하게됬네요 ^^;
=====ResultListener.aidl=====
oneway interface ResultListener {
void onResult(boolean result);
}
=====BackUpInterface.aidl=====
interface BackUpInterface{
boolean doBackUp(in ResultListener listener);
}
이렇게 했는데 아래BackUpInterface.aidl 에서 ResultListener 가 선언되지 않았다고 하네요; ㅠ
2011.01.26 15:09:05
앜 정말 죄송합니다;; 초보인데 회사에서 결과만 도출하다보니 이지경이;;; ㅠ
ㅎㅎ 또물어봐도 되죠? ^^;;
엑티비티에서 아래처럼 리스너를 넣어서 함수 실행을 하고..
OnResultListener listener = null;
mBackUpInterface.doBackUp(listener);
음.. 리스너 구현은 어디서 어떻게 하는건가요? ㅠㅠ
결과를 받는 쪽이 엑티비티쪽이니까
엑티비티에서 리스너를 정의 해놔야 할것같은데;;
서비스에서 onResult신호는 어떻게 보내나요? ㅠㅠ
계속 물어봐서 죄송하지만 마지막까지 부탁드릴꼐요 ㅠㅠ
ㅎㅎ 또물어봐도 되죠? ^^;;
엑티비티에서 아래처럼 리스너를 넣어서 함수 실행을 하고..
OnResultListener listener = null;
mBackUpInterface.doBackUp(listener);
음.. 리스너 구현은 어디서 어떻게 하는건가요? ㅠㅠ
결과를 받는 쪽이 엑티비티쪽이니까
엑티비티에서 리스너를 정의 해놔야 할것같은데;;
서비스에서 onResult신호는 어떻게 보내나요? ㅠㅠ
계속 물어봐서 죄송하지만 마지막까지 부탁드릴꼐요 ㅠㅠ
2011.01.26 16:03:51
(추천:
1 / 0)
액티비티
OnResultListener listener = new OnResultListener.Stub(){
public void onResult(boolean result){
//생략
}
};
mBackUpInterface.doBackUp(listener);
서비스
doBackUp(final OnResultListener listener){ /////////// final 붙이세요
new AsyncTask<String, Void, Boolean>(){
@Override
protected Boolean doInBackground(String... params) {
boolean ans = false;
//결과 처리
return ans;
}
@Override
protected void onPostExecute(Boolean result) {
listener.onResult(result); //결과 반환
};
}.execute("");
}
OnResultListener listener = new OnResultListener.Stub(){
public void onResult(boolean result){
//생략
}
};
mBackUpInterface.doBackUp(listener);
서비스
doBackUp(final OnResultListener listener){ /////////// final 붙이세요
new AsyncTask<String, Void, Boolean>(){
@Override
protected Boolean doInBackground(String... params) {
boolean ans = false;
//결과 처리
return ans;
}
@Override
protected void onPostExecute(Boolean result) {
listener.onResult(result); //결과 반환
};
}.execute("");
}




Listener로 이벤트를 발생시키는 형식으로 결과를 보내는건 어떠실런지요?
어플에서 요청, ProgressDialog 등으로 대기
> 서비스에서 AsyncTask로 결과값 산출 시작, 리턴은 void
> 산출 완료하면 Listener로 이벤트 발생시키고 결과 넘김
> 어플에서 ProgressDialog는 닫고 넘어온 결과 처리