다음 코드는 앞서 포스팅 한 것에 대한 문제를 조금 해결 한 것이다.

즉, 버튼을 다 누르면 ANR(5초 이내 응답 없을 시 경고 메세지와 함께 프로세스 종료) 상태 처럼 버튼에 색이 들어오고 난 다음 멈춰 있는 것을 방지 한 것이다.

방법은 쓰레드를 돌려서 핸들러를 호출하여 내용을 바꾼 방식이다.

public class ImageViewActivity extends Activity{
 ProgressDialog m_progress;
 Main_Thread m_thread;
 public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);  
  setContentView(R.layout.main);
  Button btn = (Button)findViewById(R.id.dwon);
  btn.setOnClickListener(new Button.OnClickListener(){
   public void onClick(View v){
    m_progress = ProgressDialog.show(ImageViewActivity.this, "Wait please", "Now Downloding");
    m_thread = new Main_Thread();
    m_thread.start();
   }
  });
 } 
 
 class Main_Thread extends Thread{
  String m_add = "http://google.com";
  String m_result = "";
  
  public void run(){
   StringBuilder sb = new StringBuilder();
   try{
    URL url = new URL(m_add);
    HttpURLConnection connect = (HttpURLConnection)url.openConnection();
    if(connect!=null){
     connect.setConnectTimeout(1000);
     connect.setUseCaches(false);
     if(connect.getResponseCode()==HttpURLConnection.HTTP_OK){
      BufferedReader br = new BufferedReader(new InputStreamReader(connect.getInputStream()));
      for(;;){
       String line = br.readLine();
       if(line==null) break;
       sb.append(line+'\n');       
      }
      br.close();
      m_result = sb.toString();
     }
     connect.disconnect();
    }
   }
   catch(Exception ex){}
   handler.sendEmptyMessage(0);
  }
 }
  
 Handler handler = new Handler(){
  public void handleMessage(Message msg){
   m_progress.dismiss();
   EditText txt = (EditText)findViewById(R.id.edit_txt);
   txt.setText(m_thread.m_result);
  }
 };
}

이 역시 아파치 라이브러리로 표현 가능하다 방법은 다음과 같다.

class Main_Thread extends Thread{
  String m_add = "http://google.com";
  String m_result = "";
  
  public void run(){
   HttpGet http = new HttpGet(m_add);
   DefaultHttpClient client = new DefaultHttpClient();
   try{
    client.execute(http,reshandler);
   }
   catch(Exception ex){}
   handler.sendEmptyMessage(0);
  }
 }
 
 ResponseHandler<String> reshandler = new ResponseHandler<String>(){
  public String handleResponse(HttpResponse response){
   StringBuilder sb = new StringBuilder();
   try{
    BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    for(;;){
     String line = br.readLine();
     if(line==null) break;
     sb.append(line+'\n');
    }
    br.close();
    Message message = handler.obtainMessage();
    Bundle bundle = new Bundle();
    bundle.putString("result", sb.toString());
    message.setData(bundle);
    handler.sendMessage(message);
   }
   catch(Exception ex){}
   return sb.toString();
  }
 };
  
 Handler handler = new Handler(){
  public void handleMessage(Message msg){
   m_progress.dismiss();
   EditText txt = (EditText)findViewById(R.id.edit_txt);
   txt.setText(msg.getData().getString("result"));
  }
 };
[Android] HTML 읽기 Android 2012. 3. 7. 11:35

http 통신은 다들 잘 알 것이다. 모바일 상에서는 java.net을 이용하여 이 내용을 사용하는데 get과 post가 자유롭다고 한다.

http 는 url을 통하여 데이터를 전송하는데 url 클래스 인자는 다음과 같이 두가지가 있다

URL(URL context, String spec)과 URL(String protocal, String host, int port, String file) 이다.

다음은 URL의 각 부분을 분리하는 메서드들이다.

메서드 리턴  설명 
String getProtocal() http  통신 프로토콜 
int getDefaultPort() 80 디폴트 포트 
int getPort() -1 URL의 포트, 없을 시 -1 
String getHost() www.url.com 서버주소
String getFile() /data?param=1 path와 쿼리
String getPath() /data 서버 경로
String getQuery() param=1 서버 전달 쿼리 변수 값

접속하는 주소가 정해지면 URLConnection 객체를 통해서 접근한다. 여기에 대한 메서드들은 다음과 같다.

메서드 설명 
setConnectTimeout(int timout) 연결 제한 시간을 1/1000 단위로 지정, 0일 경우 무한
setReadTimeout(int timeout) 읽기 제한 시간 지정, 0일 경우 무한
set UseCaches(Boolean flag) 캐시 사용 여부 지정
setDoInput(boolean flag) 입력 지정
setDoOutput(boolean flag) 출력 지정
setRequestProperty(String field, String value) 요청 헤더 값 설정
addRequestProperty(String field, String value)  헤더 속성 값 추가

다음은 간단히 HTML을 읽어오는 코드이다.

public class ImageViewActivity extends Activity{
 public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);  
  setContentView(R.layout.main);
  Button r_btn = (Button)findViewById(R.id.read);
  r_btn.setOnClickListener(new Button.OnClickListener(){
   public void onClick(View v){
    String html = DownloadHtml("http://google.com");
    EditText edit = (EditText)findViewById(R.id.edit_txt);
    edit.setText(html);
   }
  });
 } 
 private String DownloadHtml(String string) {
  StringBuilder html = new StringBuilder();
  try{
   URL url = new URL(string);
   HttpURLConnection connect = (HttpURLConnection)url.openConnection();
   if(connect!=null){
    connect.setConnectTimeout(1000);
    connect.setUseCaches(false);
    if(connect.getResponseCode()==HttpURLConnection.HTTP_OK){
     BufferedReader br = new BufferedReader(new InputStreamReader(connect.getInputStream()));
     for(;;){
      String line = br.readLine();
      if(line==null) break;
      html.append(line+'\n');
     }
     br.close();
    }
    connect.disconnect();    
   }
  }
  catch(Exception ex){}
  return html.toString();
 }
}

위에서 자바 코드를 썼지만 아파치 라이브러리를 이용하려면 다음과 같이 DownLoadHtml 부분을 바꿔 주면 된다.

HttpGet http = new HttpGet(string);
  DefaultHttpClient client = new DefaultHttpClient();
  String temp = "";
  try{
   HttpResponse response = client.execute(http); 
   String line = "";
   BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
   while((line=br.readLine())!=null){
    temp+=(line+'\n');
   }
   br.close();
  }
  catch(Exception ex){}
  return temp;

위에서 보면 메서드들을 이용해서 헤더를 통하여 오라클이나 타 데이터 베이스와도 통신이 가능 할 것이란 것을 추측 할 수 있다. 시간 나면 나중에 해 봐야겠다.