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

안드로이드 스레드 사용 질문이요

0 추천
reportBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String ing_alert = getResources().getString(R.string.ing_alert);
dialog = ProgressDialog.show(JemoAgent.this, "", ing_alert, true);
 
new Thread() { 
public void run() {
 
super.run();//추가
 
if(ser_yn.equals("Y")) { //봉사가 y이면
if(idEdit.getText().toString().equals("")) {
agt_id = "N";
}else {
agt_id = idEdit.getText().toString();
}
 
ser_yn = "Y";
String rep_tel_1="";//전화 번호
SQLiteDatabase db;
db = mHelper.getReadableDatabase();
Cursor cursor;
cursor = db.rawQuery("SELECT uni_ara, jel_num, jel_siz, rep_tel_1, lat, lon, org_fle_nam, uns_nam FROM oceanjelly", null);
 
File file =null;
InputStream is = null;
byte[] data =null;
InputStreamBody isb =null;
FileBody fileBody=null;
 
HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost();
 
try {
//String url = "http://medm.server.ne.kr:8888/ME/oceanv2/jemo/upload.jsp";
String url = "http://portal.nfrdi.re.kr/oeis/ME/oceanv2/jemo/upload.jsp";
request.setURI(new URI(url));
 
MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
 
StringBody sb1 = null;
StringBody sb2 = null;
StringBody sb3 = null;
StringBody sb5 = null;
StringBody sb6 = null;
StringBody sb7 = null;
 
while (cursor.moveToNext()) {
sb1=new StringBody(cursor.getString(0));
multipartEntity.addPart("uni_ara", sb1);
 
sb2=new StringBody(cursor.getString(1));
multipartEntity.addPart("jel_num", sb2);
 
sb3=new StringBody(cursor.getString(2));
multipartEntity.addPart("jel_siz", sb3);
 
rep_tel_1=cursor.getString(3);
 
sb5=new StringBody(cursor.getString(4));
multipartEntity.addPart("lat", sb5);
 
sb6=new StringBody(cursor.getString(5));
multipartEntity.addPart("lon", sb6);
 
//String fileName=cursor.getString(6).substring(cursor.getString(6).lastIndexOf("/")+1);
 
file=new File(cursor.getString(6));
fileBody=new FileBody(file);
multipartEntity.addPart("uploadedFile",fileBody);
 
sb7=new StringBody(URLEncoder.encode(cursor.getString(7),"utf-8"));
multipartEntity.addPart("uns_nam", sb7);
}
StringBody sb8=new StringBody(agt_id);
StringBody sb9=new StringBody(ser_yn);
StringBody sb10=new StringBody(rep_tel_1);
StringBody sb11=new StringBody("1");
 
multipartEntity.addPart("agt_id", sb8);
multipartEntity.addPart("ser_yn", sb9);
multipartEntity.addPart("rep_tel_1", sb10);
multipartEntity.addPart("rep_knd", sb11);
 
request.setEntity(multipartEntity);
 
HttpResponse response = client.execute(request);
HttpEntity resEntity = response.getEntity(); 
str = EntityUtils.toString(resEntity).trim();
 
if(str.equals("yes")) {//신고완료
Intent i = new Intent(JemoAgent.this, FinishAlert.class);
startActivity(i);
overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
}else if(str.equals("no")) {//신고실패
Intent i = new Intent(JemoAgent.this, FinishAlertNo.class);
startActivity(i);
overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
}else {
Intent i = new Intent(JemoAgent.this, FinishAlertNo.class);
startActivity(i);
overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
}
 
response.getEntity().getContent().close();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
//위와 비슷한 코드
}
dialog.dismiss();
}
}.start();
}
});

위 코드 처럼 버튼을 누르면 프로그래스바가 실행되며 스레드가 돕니다. 스레드가 도는 부분은 db입력 부분이구요. 이때 db 입력 시 너무 많은 시간이 소요 됩니다. 4~5분 후에 프로그래스바가 종료 되며 db 입력이 완료 되었다는 인텐트가 생성되는데요. 프로그래스바를 짧게 띄우고 완료 되었다는 인텐트는 빨리 띄우고 싶은데요. 도움 부탁드립니다. 

익명사용자 님이 2014년 6월 25일 질문

1개의 답변

0 추천
일단 UI처리하는 핸들러가없어서 구분이안가네요.. 저렇게하면 돌아가긴하는건가요?

DB에넣는작업이나..서버통신하는작업이나 완료되면 UI처리하는 부분을 핸들링하는 핸들러가 없네요

다만..좀번거로워서 안드로이드는 AsyncTask라는것을 제공해줍니다.

AsyncTask는 UI 처리 및 Background 작업 등 을 하나의 클래스에서 작업 할 수 있게 지원해 줍니다.

쉽게말해 메인Thread와 일반Thread를 가지고 Handler를 사용하여 핸들링하지 않아도

AsyncTask 객체하나로 편하게 UI를 수정 할 수 있고, Background 작업을 진행 할 수 있습니다.

각각의 주기마다 CallBack 메서드를 사용해서 말이죠.

http://developer.android.com/reference/android/os/AsyncTask.html
whdrb19 (23,520 포인트) 님이 2014년 6월 25일 답변
네 잘 돌아갑니다. db입력도 정상적으로 되구요. 문제는 프로그래스바 처리가 오래 걸린다는 것입니다. 일단 프로그래스바는 스레드 종료 시점에서 dismiss()시키구요. 프로그래스바가 화면에 오래 나타나는게 주된 문제입니다. DB입력은 바로 되는데 쓸때 없는 루프가 돌고있는거 같은데 찾을 수가 없네요.
그러면 thread를 쓰지말고 AsyncTask를 사용해보면 될까요 ㅇ_ㅇ?
...