안녕하세요 푸민입니다.
안드로이드 프로그래밍에서 Thread 를 빼놓을 수 없죠!!
주로 서버 연결하여 데이터 가져올때 많이 사용하고, 뭐 백단에서 돌릴때 굉장히 많이 사용합니다!
특히나 서버 연결은 안드로으대 프로그래밍에 가장 큰 부분을 차지하죠 ㅎㅎ
그런데 Thread 사용중에 다중 Thread 를 사용할 경우 문제가 발생합니다.
private class MyThread extends Thread{
public void run() {
http();
}
}
public void http(){
String url = "";//주소
HttpPost post = new HttpPost(url);//포스트객체생성
List<NameValuePair> params = new ArrayList<NameValuePair>();//파라미터
params.add(new BasicNameValuePair("id", id.getText().toString()));
params.add(new BasicNameValuePair("pw", pw.getText().toString()));
params.add(new BasicNameValuePair("name", name.getText().toString()));
params.add(new BasicNameValuePair("age", age.getText().toString()));
UrlEncodedFormEntity ent = null;
try {
ent = new UrlEncodedFormEntity(params, HTTP.UTF_8);
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
post.setEntity(ent);
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 10000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse response;
try {
response = httpClient.execute(post);
HttpEntity entity = response.getEntity();
if(entity!=null){
String check22 = EntityUtils.toString(entity);
test(check22);
}
else{
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
서버에서 결과가 오면 동작을 하도록하는 test() 메소드를 부르도록 프로그래밍 했는데요.
해당 결과가 한번이 아니라 여러번이 올 수 있고, 또 동시에 불릴수도 있습니다.
JoinThread joinThread = new JoinThread();
joinThread.start();
JoinThread joinThread2 = new JoinThread();
joinThread2.start();
이렇게 두번 연속해서 부를 경우 test() 메소드가 동시에 불리수 있습니다. 네트워크 상황에 따라 안 겹칠수도 있지만, 모든상황을 고려해야죠!
메소드 내에서의 처리를 할때 동시에 여러번 불릴 경우 예를 들어 파라미터가 다르게 들어올 수 있고, 또 내부에서 비정상적으로 두번 실행될 수도 있습니다.
그래서 이런 현상을 방지하기 위해 메소드를 동기화 시키면 됩니다.
synchronized public void test(String str){
...
}
메소드 앞에 synchronized 라는 예약어를 붙이게 되면 해당 메소드는 무조건 한번씩만 불립니다. 예를 들어 joinThread 와 joinThread2 에서 동시에 들어온다고 해도 먼저 들어온거 처리하고 그다음에 뒤에 들어온것을 처리합니다.
Thread 를 사용할 경우 데이터 겹치는 문제, 처음 생각했던 플로우를 잘 따르기 위해서는 동기화를 항상 조심해야 됩니다!
'Development > Android' 카테고리의 다른 글
[안드로이드] 시간 카운트 하기 (0) | 2015.09.25 |
---|---|
[안드로이드] Android ListView 속성값을 파헤쳐보자! (0) | 2015.09.24 |
[안드로이드] Android Image Volley 분석6 (0) | 2015.09.22 |
[안드로이드] Android Image Volley 분석5 (0) | 2015.09.19 |
[안드로이드] Android Image Volley 분석4 (0) | 2015.09.18 |
댓글