안녕하세요.
액티비티가 생성되면서 스레드를 하나 생성하고 데이터를 HTTP를 이용하여 다운로드 받습니다.
그런데 이 때 메인 스레드가 멈춰버립니다.
Back버튼을 클릭해도 그래도 멈춰있구요..
스래드를 데몬으로 생성해도 마찬가지로 메인 스레드가 멈춰버립니다.
이게 왜 이런건가요???
소스는 다음과 같습니다.
Thread dialogThread = new Thread(new Runnable() {
@Override
public void run() {
hShowDownloadDialog.sendEmptyMessageDelayed(0, 500);
}
});
@Override
protected void onResume() {
if( !bDownload)
{
dialogThread.run();
}//end if
super.onResume();
}
private Handler hShowDownloadDialog = new Handler()
{
public void handleMessage(Message msg){
Thread progressThread = new Thread(new Runnable() {
@Override
public void run() {
progressDialog = new ProgressDialog(VodMainActivity.this);
progressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage("데이터 수신중입니다.");
progressDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
switch(keyCode)
{
case KeyEvent.KEYCODE_BACK:
threadInterrupt = false;
finish();
}//end switch
return false;
}
});
progressDialog.show();
}
});
progressThread.setPriority(10);
progressThread.run();
hDownloadVOD.sendEmptyMessageDelayed(0, 500);
}
};
private Handler hDownloadVOD = new Handler()
{
public void handleMessage(Message msg){
downloadThread = new Thread(new Runnable() {
@Override
public void run() {
Log.i("VodMainActivity Thread Run()","Intent data request");
Intent intent = getIntent();
String sMemberSn = intent.getStringExtra(LoginActivity.INTENT_DATA_MEMBERSN);
String sCurrCode = intent.getStringExtra(LoginActivity.INTENT_DATA_CURRCODE);
String sCourseCode = intent.getStringExtra(LoginActivity.INTENT_DATA_COURSECODE);
Log.i("VodMainActivity Thread Run()","Intent data get");
String sVodDataURL = http://--------------[url]--------------------?; <- 공개할 수 없어서 이렇게 처리하였습니다.
sVodDataURL += ( "membersn=" + sMemberSn );
sVodDataURL += ( "&currcode=" + sCurrCode );
sVodDataURL += ( "&coursecode=" + sCourseCode );
Log.i("VodMainActivity onCreate()","vod url : " + sVodDataURL);
modHTTP http = new modHTTP();
try
{
if( http.getHTTP_VodList(sVodDataURL, vodInfo, items))
{
Log.i("VodMainActivity onCreate()", "Show Vod List index 0");
hCloseDownloadDialog.sendEmptyMessageDelayed(0, 500);
bDownload = true;
showVodList(0);
}//end if
else
{
//XML을 제대로 못 가져 왔을 때
Log.e("VodMainActivity onCreate()", "Can't get XML InputStream");
hCloseAlertDialog.sendEmptyMessageDelayed(0, 500);
}//end else
}catch(Exception e){
Log.e("VodMainActivity onCreate()", e.getMessage());
e.printStackTrace();
hCloseAlertDialog.sendEmptyMessageDelayed(0, 500);
}//end catch
}//end run()
});
downloadThread.setDaemon(true);
downloadThread.run();
}//end handleMessage
};
디버깅을 하기 위한 정보를 위해, 최소한 로그내용이나 소스코드에 일부분을 보여주셔야 정확한 답변이 나올 꺼라고 생각합니다
한마디로 완전 거꾸로 쓴겁니다.
백그라운드에서 네트웍 접속하고 파싱하고 하는것은 스레드에 있어야 하는 것이지 핸들러에 있을게 아닙니다.
핸들러에는 UI를 업데이트 하는 부분만 남겨야 합니다.




그런 이유라면 잘 모르겠습니다.
하지만 진짜 메인 스레드가 멈춘다면 10초이내에 ANR이 뜰텐데요. ANR이 뜨면 해당 이유를 알 수 있지 않을까요?