검색결과 리스트
분류 전체보기에 해당되는 글 253건
- 2012.03.12 [Android] 배터리
- 2012.03.12 [Android] BR
- 2012.03.12 [Android] 통지
- 2012.03.08 [Android] JSON Parser
- 2012.03.08 [Android] XML Parser
- 2012.03.08 [Android] 웹 서비스
- 2012.03.08 [Android] Image Read and Download
- 2012.03.08 [SQL] Pivot
- 2012.03.07 [Android] 비동기 방식
- 2012.03.07 [Android] HTML 읽기
글
배터리에 조사에 대한 샘플이다. 필요하면 찾아 쓰면 좋을 듯 하다.
public class ImageViewActivity extends Activity {
TextView mStatus;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mStatus = (TextView)findViewById(R.id.result);
}
public void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_BATTERY_LOW);
filter.addAction(Intent.ACTION_BATTERY_OKAY);
filter.addAction(Intent.ACTION_POWER_CONNECTED);
filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
registerReceiver(mBRBattery, filter);
}
public void onPause() {
super.onPause();
unregisterReceiver(mBRBattery);
}
BroadcastReceiver mBRBattery = new BroadcastReceiver() {
int Count = 0;
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Count++;
//배터리 충전 상태 변경, registerReceiver 메서드로 명시적으로 등록해야함
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
onBatteryChanged(intent);
}
if (action.equals(Intent.ACTION_BATTERY_LOW)) {
Toast.makeText(context, "배터리 위험 수준", Toast.LENGTH_LONG).show();
}
if (action.equals(Intent.ACTION_BATTERY_OKAY)) {
Toast.makeText(context, "배터리 양호", Toast.LENGTH_LONG).show();
}
if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
Toast.makeText(context, "전원 연결됨", Toast.LENGTH_LONG).show();
}
if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {
Toast.makeText(context, "전원 분리됨", Toast.LENGTH_LONG).show();
}
}
public void onBatteryChanged(Intent intent) {
int plug, status, scale, level, ratio;
String sPlug = "";
String sStatus = "";
//배터리 존재 여부 확인
if (intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, false) == false){
mStatus.setText("배터리 없음");
return;
}
//외부 전원 연결되어 있는지 확인, 0이면 배터리 연결, BATTERY_PLUGGED_AC면 어댑터, USB면 USB에 연결 상태
plug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
status = intent.getIntExtra(BatteryManager.EXTRA_STATUS,
BatteryManager.BATTERY_STATUS_UNKNOWN);
scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);//배터리 레벨 최대량
level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);//현재 충전 레벨
//EXTRA_HEALTH 성능 상태, EXTRA_ICON_SMALL 배터리 상태 아이콘 리소스 아이디
//EXTRA_TECHNOLOHY 배터리 방식 조사, EXTRA_TEMPERATURE 온도 조사, EXTRA_VOLTAGE 전압 조사
ratio = level * 100 / scale;
switch (plug) {
case BatteryManager.BATTERY_PLUGGED_AC:
sPlug = "AC";
break;
case BatteryManager.BATTERY_PLUGGED_USB:
sPlug = "USB";
break;
default:
sPlug = "Battery";
break;
}
switch (status) {
case BatteryManager.BATTERY_STATUS_CHARGING:
sStatus = "충전중";
break;
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
sStatus = "충전중 아님";
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
sStatus = "방전중";
break;
case BatteryManager.BATTERY_STATUS_FULL:
sStatus = "만충전";
break;
default:
case BatteryManager.BATTERY_STATUS_UNKNOWN:
sStatus = "알 수가 없어";
break;
}
String str = String.format("수신 회수:%d\n연결: %s\n상태:%s\n레벨:%d%%",
Count, sPlug, sStatus, ratio);
mStatus.setText(str);
}
};
}
설정
트랙백
댓글
글
브로드 캐스트 즉, 방송을 뜻한다. 이는 BroadcastReceiver 클래스에 상속받아 onReceive(Context,Intent) 를 호출하여 실행된다.
이들은 메인 스레드에 의해 실행 됨으로 10초의 시간 내에 접속이 되지 않으면 정지하는 습성을 지니고 있다.
방송 시작에 대해서는 sendBroadcast(Intent,String)과 sendOrderedBroadcast(Intent, String) 두가지 방법으로 호출이 된다.
다음은 샘플 예제이다.
public class ImageViewActivity extends Activity {
static final int NAPNOTI = 1;
NotificationManager mNotiManager;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.call);
btn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("imageview.test.BroadCast");
sendBroadcast(intent);
}
});
}
}
public class check extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Intent intent2 = new Intent(context, DownHtml.class);
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent2);
}
}
위에서 보면 setAction이 있음을 확인 할 수 있을 것이다. 이는 매니페스트 파일 내의
<receiver android:name=".check">
<intent-filter>
<action android:name="imageview.test.BroadCast" />
</intent-filter>
</receiver>
이와같은 부분을 추가 해 주면 된다.
이와 다르게 BroadcastReceiver 자체를 새로 생성해서 처리 할 수 있다.
액티비티를 상속받은 클래스 내에 이를 생성하고 그 아래 onReceive를 구현 해 주면 된다.
여기에서 하나 더 보태자면 onResume과 onPause를 구현해야하는데
onResume내에 들어 갈 코드는 다음과 같다.
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction("필터 이름");
registerReceiver(BroadcastReceiver);
onPause내에 들어 갈 코드는 다음과 같다.
super.Pause();
unregisterReceiver(BroadcastReceiver);
설정
트랙백
댓글
글
통지는 다들 아실 것이다. 문자가 날아온다던지 뭐 이것 저것 알릴 때 이용된다.
샘플은 다음과 같다.
public class ImageViewActivity extends Activity {
static final int NAPNOTI = 1;
NotificationManager mNotiManager;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.call);
btn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
Toast.makeText(ImageViewActivity.this, "눌러보세요", 0).show();
v.postDelayed(new Runnable() {
public void run() {
Notification noti = new Notification(R.drawable.ic_launcher,
"확인하세요",System.currentTimeMillis());
noti.defaults |= Notification.DEFAULT_SOUND;
// 진동 사용
//noti.defaults |= (Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
// 커스텀 진동
//noti.vibrate = new long[] {1000,1000,500,500,200,200,200,200,200,200};
noti.flags |= Notification.FLAG_INSISTENT;
Intent intent = new Intent(ImageViewActivity.this, check.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent content = PendingIntent.getActivity(
ImageViewActivity.this, 0, intent, 0);
noti.setLatestEventInfo(ImageViewActivity.this, "확인",
"확인했음?", content);
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.notify(1, noti);
}
}, 5 * 1000);
}
});
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
NotificationManager mNotiManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
mNotiManager.cancel(ImageViewActivity.NAPNOTI);
Button btn = (Button)findViewById(R.id.call1);
btn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
finish();
}});
}
여기에서 보면 알림 매니저에 의해 등록되고 인텐드 한 것이 호출 됨을 알 수 있다. 하지만 호출 할 때 매니페스트에 반드시 호출 할 대상을 지정 해 두는 것을 잊지 말자.
설정
트랙백
댓글
글
JSON은 XML 보다 좀 더 간략화 된 데이터의 구성이다. 이는 단순한 유니코드 텍스트 파일로 가독성이 좀 떨어지나 어느 환경이든 적용이 가능하다.
또한 파서 자체가 라이브러리 형태로 제공되어 직접 문자열을 파싱 할 필요가 없다.
JSON에 저장되는 정보 형태는 배열과 객체, 단순 값으로 된다.
다음 코드는 배열과 객체를 파싱하여 이용하는 코드 이다.
먼저 배열의 경우이다.
public class ImageViewActivity extends Activity {
EditText edit;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button call = (Button) findViewById(R.id.call);
edit = (EditText) findViewById(R.id.edit);
call.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
String str = "[1,2,3,4,5]";
try{
int sum=0;
JSONArray ja = new JSONArray(str);
for(int i=0;i<ja.length();i++){
sum+=ja.getInt(i);
}
edit.setText("total" + sum);
}
catch(JSONException ex){
Toast.makeText(v.getContext(), ex.getMessage(), 0).show();
}
}
});
}
}
위에서 봤듯 Array에 넣어 해당하는 타입으로 가져와 데이터를 조작 할 수가 있다. 다음은 객체형이다.
onClick 내의 내용을 다음과 같이 바꾸기만 하면 된다.
String str = "[{\"one1\":\"1\", \"one2\":\"11\", \"one3\":\"111\"},{\"one1\":\"2\", \"one2\":\"22\", \"one3\":\"222\"}]";
String temp = "";
try{
JSONArray ja = new JSONArray(str);
for(int i=0;i<ja.length();i++){
JSONObject obj = ja.getJSONObject(i);
temp += obj.getString("one1")+obj.getString("one2")+obj.getString("one3")+"\n";
}
edit.setText(temp);
}
catch(JSONException ex){
Toast.makeText(v.getContext(), ex.getMessage(), 0).show();
}
객체형은 getJSONObject에서 가져와 각기 데이터를 추출한다. 여기에서 배열 형태로 저장된 규칙을 잘 지키기만 하면 된다.
설정
트랙백
댓글
글
XML에는 크게 DOM과 SAX 파서가 존재한다.
DOM은 트리 형식으로 문서를 읽으면서 전체 구조 파악 후 정보를 구하고 SAX는 순차적으로 문서를 읽으면서 정보를 차례대로 읽는 방식이다.
다음이 그 예제이다.
public class ImageViewActivity extends Activity{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button call = (Button)findViewById(R.id.call);
call.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<order><item>unit</item>"+
"<item one=\"one1\" two=\"two2\">first</item>"+
"<item one=\"one2\" two=\"two2\">second</item>"+
"</order>";
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//자체가 추상 클래스임으로 빌더 객체를 얻고 난 다음 메서드로 문서를 파싱하면 Document 객체가 생성이 됨.
DocumentBuilder builder = factory.newDocumentBuilder();
InputStream stream = new ByteArrayInputStream(xml.getBytes("utf-8"));
Document doc = builder.parse(stream);
org.w3c.dom.Element order = doc.getDocumentElement();//루트 엘리먼트 가져옴
NodeList items = order.getElementsByTagName("item");
//한줄의 간단 경우
//Node item = items.item(0);
//Node text = item.getFirstChild();
//다수의 아이템 경우
String result = "";
for(int i=0;i<items.getLength();i++){
Node item = items.item(i);
Node text = item.getFirstChild();//노드 탐색하는 형태 지정 함
String name = text.getNodeValue();//getNodeName과 getNodeType을 이용하여 이름과 타입도 가져옴
result+=name+" --- ";
NamedNodeMap attrs = item.getAttributes();//속성 값을 가져오기 위함
for(int j=0;j<attrs.getLength();j++){
Node attr = attrs.item(j);
result+=attr.getNodeName()+"="+attr.getNodeValue();
}
result+="\n";
}
EditText edit = (EditText)findViewById(R.id.edit);
edit.setText(result);
}
catch(Exception ex){
Toast.makeText(v.getContext(), ex.getMessage(), 0).show();
}
}
});
}
}
DOM은 속도가 빠르며 임의 노드를 여러번 읽지만 최초 시작이 조금 느리면서 문서 크기에 따라 메모리에 대한 부하가 커진다. 반면 SAX는 메모리를 거의 사용하지 않으며 최초 실행이 빠르다. 하지만 읽기만을 담당한다.
public class ImageViewActivity extends Activity {
EditText edit;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button call = (Button) findViewById(R.id.call);// ��
edit = (EditText) findViewById(R.id.edit);
call.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
edit.setText("Test");
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<order><item>sss</item></order>";
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
SaxHandler handler = new SaxHandler();
reader.setContentHandler(handler);
InputStream stream = new ByteArrayInputStream(xml
.getBytes("utf-8"));
reader.parse(new InputSource(stream));
edit.setText(handler.sb.toString());
} catch (Exception ex) {
Toast.makeText(v.getContext(), ex.getMessage(), 0).show();
}
}
});
}
class SaxHandler extends DefaultHandler {
boolean flag = false;
StringBuilder sb = new StringBuilder();
public void startDocument() {
}
public void endDocument() {
}
@Override
public void startElement(String uri, String localName, String qName,
org.xml.sax.Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
Log.d("DATA", "startElement");
// @Override
if (localName.equals("item")) {
flag = true;
}
}
public void endElement(String uri, String localName, String qName) {
}
@Override
public void characters(char[] chars, int start, int length) {
// @Override
Log.d("DATA", "startElement");
if (flag) {
sb.append(chars, start, length);
flag = false;
}
}
};
}
그 외에 XmlPullParser 라는 것이 있다. 이는 SAX와 유사하나 이벤트 발생시마다 핸들러 대신 루프 돌면서 이벤트를 직접 조사한다.
예제는 다음과 같다.
public class ImageViewActivity extends Activity {
EditText edit;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button call = (Button) findViewById(R.id.call);
edit = (EditText) findViewById(R.id.edit);
call.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
edit.setText("Test");
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<order><item>sss</item></order>";
boolean flag = false;
String name = "";
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(xml));
int type = parser.getEventType();
while(type!=XmlPullParser.END_DOCUMENT){
switch(type){
case XmlPullParser.START_DOCUMENT : break;
case XmlPullParser.END_DOCUMENT : break;
case XmlPullParser.START_TAG :
if(parser.getName().equals("item")){
flag = true;
}
case XmlPullParser.END_TAG : break;
case XmlPullParser.TEXT :
if(flag){
name = parser.getText();
flag = false;
}
break;
}
type = parser.next();
}
edit.setText(name);
} catch (Exception ex) {
Toast.makeText(v.getContext(), ex.getMessage(), 0).show();
}
}
});
}
class SaxHandler extends DefaultHandler {
boolean flag = false;
StringBuilder sb = new StringBuilder();
public void startDocument() {
}
public void endDocument() {
}
@Override
public void startElement(String uri, String localName, String qName,
org.xml.sax.Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
Log.d("DATA", "startElement");
// @Override
if (localName.equals("item")) {
flag = true;
}
}
public void endElement(String uri, String localName, String qName) {
}
@Override
public void characters(char[] chars, int start, int length) {
// @Override
Log.d("DATA", "startElement");
if (flag) {
sb.append(chars, start, length);
flag = false;
}
}
};
}
설정
트랙백
댓글
글
public class ImageViewActivity extends Activity{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button call = (Button)findViewById(R.id.call);
call.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
String xml;
String name = "사용자";
int count=2;
String url = "http://twitter.com/statuses/user_timeline.xml?screen_name="+name+"&count="+count;
xml = DownloadHtml(url);
EditText edit = (EditText)findViewById(R.id.edit);
edit.setText(xml);
}
});
}
String DownloadHtml(String add){
StringBuilder sb = new StringBuilder();
try{
URL url = new URL(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();
}
connect.disconnect();
}
}
catch(Exception ex){}
return sb.toString();
}
}
이 코드를 실행해보면 최근 게시물 두개를 요청 한 것이다.
설정
트랙백
댓글
글
서버상에서 이미지를 읽어와서 이미지 뷰에 보이고 또한 다운로드 받는 예제이다.
다운받은 파일은 DDMS 상에서 확인이 가능하다.
public class ImageViewActivity extends Activity{
ImageView m_imgview;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
m_imgview = (ImageView)findViewById(R.id.img);
Button draw_btn = (Button)findViewById(R.id.draw);
draw_btn.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
String imgurl="파일경로";
{
InputStream is;
try {
is = new URL(imgurl).openStream();
Bitmap bmp = BitmapFactory.decodeStream(is);
m_imgview.setImageBitmap(bmp);
is.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
Button down_btn = (Button)findViewById(R.id.down);
down_btn.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
String imgurl="파일경로";
int index = imgurl.lastIndexOf('/');
String localimg = imgurl.substring(index+1);
String path = Environment.getDataDirectory().getAbsolutePath();
path += "/data/imageview.test/"+localimg;
if(new File(path).exists()==false){
DownLoadImage(imgurl,localimg);
}
Bitmap bitmap = BitmapFactory.decodeFile(path);
m_imgview.setImageBitmap(bitmap);
}
});
}
boolean DownLoadImage(String url, String filename){
URL imgurl;
int read;
try{
imgurl = new URL(url);
HttpURLConnection connect = (HttpURLConnection)imgurl.openConnection();
int length = connect.getContentLength();
byte[] data = new byte[length];
InputStream is = connect.getInputStream();
FileOutputStream fos = openFileOutput(filename,0);
for(;;){
read = is.read(data);
if(read<=0) break;
fos.write(data,0,read);
}
is.close();
fos.close();
connect.disconnect();
}
catch(Exception ex){return false;}
return true;
}
}
설정
트랙백
댓글
글
한동안 쿼리 작성 할 때 사용하지 않아 까먹지 않기 위해 긁적..
함수들 그러고보니... 대다수 까먹은거 같네.. 지금 보는거 끝나면 다시 좀 봐야겠다..
Pivot은 다음 형태로 이용한다.
SELECT*
FROM
(
추출대상 쿼리
) PIVOT
(
SUM(QTY) FOR GRADE IN('G1' AS "G1",'G2' AS "G2",'G3' AS "G3",'G4' AS "G4",'G5' AS "G5",'G6' AS "G6")
)
까먹지 말자..
설정
트랙백
댓글
글
즉, 버튼을 다 누르면 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