마스터Q&A
접속유지
가입하기
안드로이드 Q&A
최근 질문
미답변 질문
태그
사용자
질문하기
마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다.
안드로이드펍
에서 운영하고 있습니다. [
사용법
,
운영진
]
인기있는 태그
초보어플개발
(3427)
안드로이드스튜디오
(2664)
안드로이드-초보어플개발
(1333)
안드로이드-스튜디오
(1086)
도와주세요-
(995)
이미지
(970)
listview
(866)
리스트뷰
(844)
오류
(805)
레이아웃
(693)
fragment
(675)
webview
(670)
동기화 관련 문제인거 같습니다.
0
추천
메인쓰레드랑 새로생성한네트워크작업 쓰레드가 있습니다.
만약 메인쓰레드에서 네트워크작업쓰레드를 스타트시키면,
근데 이게 쓰레드니까 네트워크작업쓰레드의 스타트만 하고
바로 스타트한 다음구문이 실행되잖아요.
근데 이 네트워크작업쓰레드가
끝난다음에야 메인쓰레드의 다음구문이
실행되게 하려면 어떻게 처리를 해야 할까요?
쓰레드
동기화
네트워크
갸아악
(
21,260
포인트)
님이
2013년 4월 24일
질문
Please
log in
or
register
to add a comment.
답변 달기
·
글에 소스 코드 보기 좋게 넣는 법
·
질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
답변이 채택되거나 답변에 댓글이 달리면 이메일로 알려드립니다:
답변이 채택되거나 댓글이 달리면 이메일로 알려드립니다
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면
로그인
하거나 혹은
가입
하세요.
2개의 답변
+1
추천
채택된 답변
Thread.join이라는 함수가 있습니다. 이 함수를 이용하면 해당 쓰레드가 끝날때까지 대기할 수 있습니다.
그런데, 쓰레드 끝날때 까지 대기할거라면 구지 쓰레드로 뽑을 이유가 없을 것 같은데요.
레오나
(
3,290
포인트)
님이
2013년 4월 24일
답변
갸아악
님이
2013년 4월 25일
채택됨
네트워크로 무언가를 받아와서 비교후에 넘어가야되서...
네트워크를 메인에서 처리하면 죽어버려서 쓰레드로 뺏는데요..
이 네트워크에서 값을 다 받아오고 이 값에 따라서 분기처리를 해야되서
다 가져올때까지 다음으로 넘어갈수가 없습니다.ㅠㅠ
AsyncTask를 쓰시면 되겠네요.
new AsyncTask<Void, String, Void)() {
@Override
public void doInBackground() {
// Network 작업
return network_result;
}
@Override
public void onPostExecute(String network_result) {
// 네트웍 결과값 받아서 다음 작업 실행
}
}.execute();
답변 감사드립니다.
그런데 현재 이미 완성된 프로젝트에 중간에 삽입하는 형태라서..
만약
new Async... .excute(); 이렇게 하여 위에 말씀하신걸 실행한다 치면.
AsyncTask는 비동기로 실행되고,
메인클래스의 Async호출 바로 아래 구문들은 그대로 다 실행이 되어버릴텐데
따로 while문으로 블락을 걸어줘야 할까요?
이런식이 되겠죠..
이전코드
void f() {
String network_result = do_network();
do_work_after_network(network_result);
}
변경된 코드
void f_async() {
new AsyncTask<Void, String, Void)() {
@Override public void doInBackground() {
return do_network();
}
@Override public void onPostExecute(String network_result) {
do_work_after_network(network_result);
}
}.execute();
}
주의할 것은 이전 f()함수는 이제 f_async()로 비동기적으로 변경되었으므로 f_async()함수는 바로 리턴합니다.(물론 네트웍 작업이 끝나면 그 이후 작업은(메인쓰레드에서) 잘 이루어집니다). 보통 이런 경우에 네트웍 작업이 끝날때까지 사용자가 딴 짓을 못하게 하기 위해 UI를 막아야 겠죠. 딱 좋은게 Progress Spinner를 띄우는 것이겠죠.
이 Spinner는 onPreExecute()에서 띄우고 onPostExecute()에서 dismiss()하면 됩니다.
훌륭하신 가르침 진심으로 감사드립니다.
정말 많은 도움 되었습니다. ㅎㅎ
복받으세요!
Please
log in
or
register
to add a comment.
0
추천
음... 조건을 주어서 실행하는 방법이 있지 않을까요? 예를 들어 boolean endOfThread = false;
였던 것이 true가 되면 실행되는 if문을 만들고 그 문장을 감싸는 while문을 만들고 , if 문에 들어가서 실행되었을때는
break로 while문을 빠져나오면 어떨까싶네요
밉샹
(
500
포인트)
님이
2013년 4월 24일
답변
Please
log in
or
register
to add a comment.
...