검색결과 리스트
Android HttpConnection에 해당되는 글 2건
- 2012.03.07 [Android] 비동기 방식
- 2012.03.07 [Android] HTML 읽기
글
다음 코드는 앞서 포스팅 한 것에 대한 문제를 조금 해결 한 것이다.
즉, 버튼을 다 누르면 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"));
}
};
즉, 버튼을 다 누르면 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"));
}
};
설정
트랙백
댓글
글
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;
위에서 보면 메서드들을 이용해서 헤더를 통하여 오라클이나 타 데이터 베이스와도 통신이 가능 할 것이란 것을 추측 할 수 있다. 시간 나면 나중에 해 봐야겠다.
RECENT COMMENT