본문 바로가기

Archive

android - AsyncTask + http GET 처리하기.

무작정 메인 스레드에서 httpRequest를 처리하면 

android.os.NetworkOnMainThreadException 라는 예외가 발생하게 된다.

메인스레드에서 리퀘스트 요청 중에는 프리징 현상이 발생하고 OS내부에서 프리징 현상을 에러로 감지하기 때문에(실제로는 정상작동 하지만..)

해당 예외가 호출됨..


이를 해결하기 위해서는 AsyncTack 클래스를 상속받아 비동기적으로 루틴을 처리하여야 한다.

아래는 간단한 http GET request를 처리하기 위한 예제이다.


해당 이슈를 처리하기 위해 httpRequest라는 클래스를 만들고 내부에서 GET을 처리하게 된다..

import android.os.AsyncTask;
import android.util.Log;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import java.net.URL;

public class httpRequest extends AsyncTask<URL, Void, Void> {

  public void reqGET(URL url) {
    try {
      HttpClient client = new DefaultHttpClient();
      HttpGet get = new HttpGet(String.valueOf(url));
      HttpResponse resGET = client.execute(get);
      HttpEntity resEntityGET = resGET.getEntity();

      if(resEntityGET != null) {
        Log.i("httpRequest", EntityUtils.toString(resEntityGET));
      }

    } catch(Exception e){
      e.printStackTrace();
    }
    Log.i("httpRequest", "conn");
  }

  @Override
  protected Void doInBackground(URL ... params) {
    reqGET(params[0]);
    return null;
  }
}

메인 액티비티에서의 사용할 때는 아래 코드를 이용하면 됨..

try {
  new httpRequest().execute(new URL("[URL]"));
} catch(Exception e) {
  e.printStackTrace();
}


'Archive' 카테고리의 다른 글

must know  (0) 2014.11.06