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

스레드 관련 질문입니다~!!!

0 추천
 
public class bangsong extends Activity {
 
String song, story, str;
int b;
boolean isrun;
 
~~~~~~
 
public void mOnclick(View v) {
 
new AlertDialog.Builder(this).setTitle("방송신청")
.setMessage("이대로 신청하시겠습니까?")
 
.setPositiveButton("신청", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
 
bangsong2 a = new bangsong2();
a.start();
a.interrupt();
}
 
}).setNegativeButton("취소", null).show();
}
 
public class bangsong2 extends Thread {
 
public void run() {
 
isrun = true;
 
while (isrun) {
 
song = ((EditText) (findViewById(R.id.editText1))).getText()
.toString();
 
story = ((EditText) (findViewById(R.id.editText4))).getText()
.toString();
 
if (song.equals("")) {
b = 3;
} else if (story.equals("")) {
b = 4;
} else {
 
URL url = null;
try {
url = new URL("~~~.php");
} catch (MalformedURLException e) {
e.printStackTrace();
}
 
HttpURLConnection server = null;
try {
server = (HttpURLConnection) url.openConnection();
} catch (IOException e) {
 
e.printStackTrace();
 
}
 
server.setDefaultUseCaches(false);
server.setDoInput(true);
server.setDoOutput(true);
server.setAllowUserInteraction(true);
 
try {
server.setRequestMethod("POST");
} catch (ProtocolException e) {
 
e.printStackTrace();
}
 
server.setRequestProperty("content-type",
"application/x-www-form-urlencoded");
StringBuffer buffer = new StringBuffer();
SharedPreferences pref = getSharedPreferences("PrefTest", 0);
String prefid = pref.getString("pid", "");
buffer.append("id").append("=").append(prefid).append("&");
buffer.append("story").append("=").append(story)
.append("&");
buffer.append("song").append("=").append(song);
 
OutputStreamWriter outStream = null;
try {
outStream = new OutputStreamWriter(
server.getOutputStream(), "EUC-KR");
} catch (UnsupportedEncodingException e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
Log.e("StackTraceExampleActivity", exceptionAsString);
} catch (IOException e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
Log.e("StackTraceExampleActivity", exceptionAsString);
}
PrintWriter writer = new PrintWriter(outStream);
writer.write(buffer.toString());
writer.flush();
 
 
 
 
 
 
 
InputStreamReader tmp = null;
try {
tmp = new InputStreamReader(server.getInputStream(),
"EUC-KR");
}
 
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
 
catch (IOException e) {
e.printStackTrace();
}
 
BufferedReader reader = new BufferedReader(tmp);
 
try {
str = reader.readLine();
if (str.equals("1")) {
b = 1;
} else {
b = 2;
}
 
} catch (IOException e) {
e.printStackTrace();
}
 
}
mhandler12.sendEmptyMessage(0);
 
}
}
 
};
 
Handler mhandler12 = new Handler() {
public void handleMessage(Message msg) {
 
if (b == 1) {
 
Toast.makeText(bangsong.this, "접수되었습니다", Toast.LENGTH_SHORT)
.show();
 
isrun = false;
 
} else if (b == 2) {
Toast.makeText(bangsong.this, "네트워크 이상", Toast.LENGTH_SHORT)
.show();
} else if (b == 3) {
Toast.makeText(bangsong.this, "신청곡을 채워주세요", Toast.LENGTH_SHORT)
.show();
} else if (b == 4) {
Toast.makeText(bangsong.this, "사연을 채워주세요", Toast.LENGTH_SHORT)
.show();
}
 
}
};
 
}
 
  방송사연과 신청곡을 보내는 기능의 액티비티입니다. 신청을 위해 메인 스레드 외에 별도의 스레드를 생성해서 보낸 다음서버에서 1을 받아오면 이것을 메인 스레드의 핸들러에 전달해서 "접수되었습니다."라고 토스트를 화면에 띄워주는 것입니다. 그런데 신청을 하고 서버를 보면 한번 신청했는데도 꼭 2번 중복 신청이 되어있습니다. 왜 그럴까요? ㅜㅜ
 
  그리고 스레드를 죽이기 위해 a.interrupt();를 썼고 또 핸들러에서 스레드에서의 while 플래그값을 false로 주었는데 맞나요? run() 함수 안에 while(flag)의 flag 값을 false로 준다 해도 결국 run 함수는 실행되고 있는 거 아닌가요? 구글링하니 거의 이런식으로 플래그를 주길래 한번 써봤는데... 이 소스에서 스레드를 완전히 죽이기 위한 개선소스도 알려주시면 감사하겠습니다^^

 

우정맨 (260 포인트) 님이 2014년 7월 2일 질문

1개의 답변

0 추천
if (str.equals("1")) {
b = 1;
} else {
b = 2;
}
이게 성공 실패 유무인가요?
그럼 isrun을 여기서 처리하세요..

 

그리고... 비동기처리클래스... AsyncTask를 쓰세요...

Thread를 가지고 Handler를 사용하여 핸들링하지 않아도 AsyncTask클래스 하나로 편하게 UI를 수정 할 수 있고..

Background 작업을 진행 할 수 있습니다.

whdrb19 (23,520 포인트) 님이 2014년 7월 3일 답변
...