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

AsyncTask 효율적으로 사용하는방법

0 추천
아래와 같이 AsyncTask 를 상속받은 클래스를 만들었습니다.
한개의 AsycnTask에서 조건에 따라 여러가지 처리를 하고 싶은데, 가능한가요?
지금처럼 params[0]을 key값으로 잡고, 두번째를 url로 잡아놓기는 하였는데
생각해보니 onPostExecute 에서 result로 받는 값이 daumapi인지, naverapi인지 확인이 불가능할 거 같습니다.
물론 전역변수를 두어 확인을 할 수 있다지만, 비동기 호출이라 순서대로 결과값을 받아온다는 보장이 있을지도 의문이구요.

AsyncTask는 복잡해보여 사용하지 않다가, 지금보니 매우 유용할 것 같네요.
AsyncTask 사용 관련 노하우를 전해주시면 감사하겠습니다.


MyAsyncTask myAsyncTask = new MyAsycnTask();

myAsyncTask.execute("daumapi", "http://~~~");




 public class MyAsyncTask extends AsyncTask<String, Void, String> {

    	@Override
    	protected void onPreExecute() {
    		super.onPreExecute();
    	}
    	
		@Override
		protected String doInBackground(String... params) {
			
			String str = "";
			if("daumapi".equals(params[0])){
				try {
					HttpGet get = new HttpGet(params[1]);
					HttpClient client = new DefaultHttpClient();
					HttpResponse responseGet = client.execute(get);
					HttpEntity resEntityGet = responseGet.getEntity();

					str = EntityUtils.toString(resEntityGet);
				} catch (Exception e) {
					e.printStackTrace();
				}
			} else if("naverapi".equals(params[0])){
				// 별도 처리
			}
			
			return str;
		}
		
		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			try {
				// 결과값 처리
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		@Override
		protected void onCancelled() {
			super.onCancelled();
		}
		
    }

 

개발자초심 (21,220 포인트) 님이 2015년 6월 2일 질문

1개의 답변

0 추천
전역변수를 MyAsyncTask클래스 안에다가 선언해주고

doInBackGround에서 값주고

onPostExecute에서 값 확인하면 문제 없을 듯 합니다.

 

또는

 

extneds AsyncTask<String,Void,String>대신

extends AsycTask<String,Void,String[]>과 같이 수정하여

doInBackGround의 리턴값을 배열이나 List로 주어도 되겠네요
파닭칡힌 (1,820 포인트) 님이 2015년 6월 2일 답변
리턴값으로 처리를 해봐야겠네요.
전역변수같은 경우, AsyncTask 내에서 Http통신을 한다고 하였을때, 응답 시간에 따라 결과값이 꼬이진 않을까 싶은 생각이 문득 들었습니다.
조언 감사합니다.
AsyncTask내부 변수로 선언해서 사용하면 값이 꼬이는 일은 없을거라 봅니다만,
아무래도 리턴 값으로 처리하는게 확실하겠죠
...