앱엔진 짱이네요-_-
속도만 빨랐다면 호스팅을 여기로 옮겨도 뭐 문제가 없을 듯. 시스템적으로는 구글이 다 관리해주고, 개발환경도 매우 편하니...(하지만, DB 접근이 방식이 틀려서 힘든면도 있지만ㅠ)

pc랑 android랑 뭔가 싱크맺는 뭐 그런거 만드려다보니 여기까지 와버렸네요-_- 이걸 통해서 하면 좋을 것 같아서^^

암튼, Channel API를 제공하는데, 원하는 채널을 생성해서 그곳 페이지로 접속한 사용자들끼리 메세지를 주고 받을 수 있게 됩니다. 

앱엔진 채널부분 문서입니다.
http://code.google.com/intl/ko-KR/appengine/docs/java/channel/

보면 JavaAPI랑 JavascriptAPI 두개 있는데, 클래스도 몇 개 없습니다.
Java에서는 ChannelService를 가져와서 createChannel로 채널을 만든 뒤에, sendMessage함수로 메세지만 보내면 됩니다.
Javascript에서는 goog.appengine.Channel이라는 클래스가 존재하는데, 이걸로 오픈하고 메세지 받으면 됩니다.

일단..... 나중에 쓰려고 만든거다보니 Spring3.0과 jQuery가 들어갔네요-_-
http://mudchobo.tistory.com/470 이거 참조해서 환경 구축을 하면 됩니다~^^

ChannelController.java

package com.mudchobo.apps.exchangepp.controller;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.google.appengine.api.channel.ChannelMessage;
import com.google.appengine.api.channel.ChannelService;
import com.google.appengine.api.channel.ChannelServiceFactory;

@Controller
@RequestMapping("/channeltest")
public class ChannelController {
	
	private String channelName = "test";
	
	@RequestMapping(value="/test", method=RequestMethod.GET)
	public String test(Model model){
		ChannelService channelService = ChannelServiceFactory.getChannelService();
		String token = channelService.createChannel(channelName);
		model.addAttribute("token", token);
		return "test";
	}
	
	@RequestMapping(value="/open", method=RequestMethod.POST)
	@ResponseBody
	public String openChat(){
		ChannelService channelService = ChannelServiceFactory.getChannelService();
		channelService.sendMessage(new ChannelMessage(channelName, "open"));
		return "";
	}
	
	@RequestMapping(value="/send", method=RequestMethod.POST)
	@ResponseBody
	public String sendChat(@RequestParam("msg") String msg){
		System.out.println("message = " + msg);
		try {
			ChannelService channelService = ChannelServiceFactory.getChannelService();
			channelService.sendMessage(new ChannelMessage(channelName, URLEncoder.encode(msg, "UTF-8")));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return "";
	}
}
최초 접속페이지는 /test 입니다.
여기서 채널을 생성해줍니다. 이 생성해서 나온 토큰을 client로 전달합니다. 그러면 그 client에서 goog.appengine.Channel("토큰값");을 통해 Channel을 생성합니다. 그러면 커넥션을 맺고 있게 되는겁니다.

클라이언트부분
test.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page isELIgnored="false" %>
<!doctype html>
<html>
	<head>
		<script src="/_ah/channel/jsapi"></script>
		<script src="/js/lib/jquery-1.4.4.min.js" type="text/javascript"></script>
		<script type="text/javascript">
			var sendMessage = function(path, msg){
				var xhr = new XMLHttpRequest();
				xhr.open("POST", "/apps/channeltest/" + path + "?msg=" + encodeURIComponent(msg), true);
				xhr.send();
			}
			
			var onOpen = function(){
				sendMessage("open");
			};
			var onMessage = function(m){
				var msg = decodeURIComponent(m.data.split("+").join(" "));
				$("#message_box ul").append("<li>" + msg + "</li>");
				$("#message_box").scrollTop(999999999);
			};
			var onError = function(){
				alert("error");
			};
			var onClose = function(){
				alert("close");
			};
			
			$(document).ready(function(){
				var channel = new goog.appengine.Channel("${token}");
				var socket = channel.open();
				socket.onopen = onOpen;
				socket.onmessage = onMessage;
				socket.onerror = onError;
				socket.onclose = onClose;
				
				$("#send_btn").click(function(){
					sendMessage("send", $("#message").val());
					$("#message").val("");
				});
				$("#message").keyup(function(e){
					if (e.keyCode == 13){
						sendMessage("send", $("#message").val());
						$("#message").val("");
					}
				});
			});
		</script>
	</head>
	<body>
		<div id="message_box" style="width:500px;height:300px;overflow:scroll;font-size:12px">
			<ul></ul>
		</div>
		<input type="text" id="message" name="message" />
		<input type="button" value="보내기" id="send_btn" name="send_btn" /><br />
	</body>
</html>
일단 Channel클래스를 쓰려면 <script src="/_ah/channel/jsapi"></script>를 include해야해요. 그리고, new goog.appengine.Channel생성부분을 유심히 보면 함수로 onopen, onmessage, onerror, onclose를 등록할 수 있어요. 메세지를 받으면 onmessage가 호출이 되니 여기서 처리하면 됨 ㅇㅇ 보내는 것은 아까 java에서 만들어 놓은 url을 호출하면 됨. 끗~

예제주소는 여기
http://mudchobo.appspot.com/apps/channeltest/test

소스파일...귀찮아서 그냥....통째로.....-_-



ps. 한글이 깨지길래 보낼 때 인코딩하고, 다시 받을 때 url인코딩해서 보내고 받은 걸 푸는 방식으로 했더니 되네요. 

 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 레몬에이드 2011.01.31 14:05 신고  댓글주소  수정/삭제  댓글쓰기

    음... 역쉬 만능! 못하시능게 없어! +ㅁ+

  2. JIN32 2011.03.09 15:47 신고  댓글주소  수정/삭제  댓글쓰기

    죄송하지만 한가지 여쭤볼께요.
    로컬에서 테스트할때

    <script src="/_ah/channel/jsapi"></script>

    이 부분에요.

    com.google.appengine.api.channel.dev.LocalChannelFailureException: Channel for application key null not found.

    이런 오류가 발생되는데...
    혹시 해결방법 알고 계시는지 궁금해서 댓글 남겨봅니다.

    암튼 좋은글 잘 보고 갑니다.
    감사합니다. ^^

  3. Jin 2011.09.06 00:57 신고  댓글주소  수정/삭제  댓글쓰기

    우와 전부터 앱엔진으로 채팅기능 구현하고싶었는데 channel api가 있는지 처음알았네요 좋은정보 감사합니다^^

  4. gslee 2011.09.22 08:41 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~
    구글앱엔진 java 를 공부하고있는데요안드로이드랑연결시켜서 간단하게 방명록처럼만드려고 하는데 한글이 전부깨지내요 ㅠ
    해결방법을 아시면 저에게 도움좀 부탁드립니다^^
    skyyy80@gmail.com

  5. gslee 2011.09.22 08:41 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~
    구글앱엔진 java 를 공부하고있는데요안드로이드랑연결시켜서 간단하게 방명록처럼만드려고 하는데 한글이 전부깨지내요 ㅠ
    해결방법을 아시면 저에게 도움좀 부탁드립니다^^
    skyyy80@gmail.com

 
여기저기 메이븐이 많이 쓰이는 것 같아 이참에 삽질을 해봤습니다.
Maven은 소프트웨어 프로젝트 관리툴인데, 의존적인 라이브러리를 서버와 연동해서 쉽게 업데이트를 해주며, 컴파일 및 배포 과정을 최소화하며 자동으로 테스트를 할 수 있게 도와주는 뭐 그런 툴인 듯 합니다.

한마디로 나름 그냥 편하려고 만든거라는거-_-

라이브러리를 수동으로 복사해서 lib폴더에 쳐넣는 행위를 막고 자동으로 라이브러리를 업데이트할 수 있게 해주는 것만해도 큰 장점인 것 같습니다.

1. Maven 다운로드 및 설치
http://maven.apache.org/download.html 여기서 최신버전인 3.0을 받아서 압축해제
환경변수 Path에 maven디렉토리/bin폴더를 걸어두셔야 어디서든 mvn을 때릴 수 있기에 추가!
환경변수 MAVEN_HOME을 maven디렉토리홈으로 해서 추가!

2. m2eclipse설치
이건 이클립스에서 maven템플릿파일을 쉽게 생성할 수 있는 플러그인입니다.
eclipse에서 Help -> Install New Software -> Add해서 url을 http://m2eclipse.sonatype.org/sites/m2e/ 로 한다음에 Maven Integration for eclipse를 체크하고 설치하면 됩니다 ㄷㄷ

3. Mavan프로젝트 생성
이제 Maven프로젝트 생성을 합니다.
New -> Project 하면 Maven Project가 새로 생겼음.
선택하고, location에서 디폴트로하고 Next하고, 우린 webapp을 만들꺼니까 groupid가 org.apache.maven.archetypes이고, Artifact Id가 maven-archetype-webapp을 선택하고 Next!
Group Id는 패키지명으로 대충 com.mudchobo.springtest라고 하고,
Artifact Id는 프로젝트 이름이니까 대충 SpringTest로....-_-

그리고 이제 cmd쳐서 콘솔로가서 SpringTest폴더로 이동. 아래 커맨드발동!
[code]mvn -Dwtpversion=2.0 eclipse:eclipse[/code]
그러면 wtp용 프로젝트로 변환이 되어있을겁니다.
그리고 이상하게 Java Compiler가 1.4로 맞춰져있는데, 1.6으로 맞춥니다.
프로젝트Properties에서 Java Compiler에서ㅓ 1.6으로 맞추고, 아래 Use default compliance setting체크해주시면 됨 ㅇㅇ
그리고 Project Facets에서 Java를 6.0으로 바꿔주시면 됨 ㅇㅇ

4. 의존성 라이브러리 추가
pom.xml
[code]<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mudchobo.springtest</groupId>
  <artifactId>SpringTest</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>SpringTest Maven Webapp</name>
  <properties>
      <spring.version>3.0.5.RELEASE</spring.version>
  </properties>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${spring.version}</version>
    </dependency>
    <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>${spring.version}</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>SpringTest</finalName>
  </build>
</project>
[/code]
스프링 라이브러리 2개를 추가했습니다. 그러면 뭔가 웹에서 다운받으면서 라이브러리를 저장소에 저장해둡니다 ㄷㄷ 뭔가 알아서 처리하는 느낌!

5. 이제 스프링라이브러리를 쓰도록 web.xml수정 및 spring-servlet.xml추가!
web.xml
[code]<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Court Reservation System</display-name>

    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
[/code]
spring-servlet.xml
[code]<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
</beans>[/code]

6. Maven Dependencies 라이브러리 추가.

그냥 실행하게 되면 메이븐에서 읽어드린 라이브러리가 추가되지 않아 Eclipse에 있는 Server에 SpringTest프로젝트를 추가하면 ClassNotFoundException에러가 납니다.
[code]심각: Error loading WebappClassLoader
  context: /SpringTest
  delegate: false
  repositories:
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1172e08
 org.springframework.web.servlet.DispatcherServlet
java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet[/code]
그래서 저도 뭔가 라이브러리를 추가해야된다는 생각에 구글링을 해보니 방법이 있군요!

해당 프로젝트폴더에 .setting폴더에 있는 org.eclipse.wst.common.component파일
org.eclipse.wst.common.component
[code]<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/java" />
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/resources" />[/code]위에 두줄 지우고,
[code]<dependent-module deploy-path="/WEB-INF/lib">
    <dependency-type>uses</dependency-type>
</dependent-module>[/code]3줄추가하고~

그리고 .classpath파일에 아래 클래스패스를 추가합니다.
.classpath
[code]<classpathentry exported="true" kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER">
    <attributes>
        <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
    </attributes>
</classpathentry>[/code]
그러면 프로젝트properties에서 Java Build Path에서 Library를 보면 Maven Dependencies가 추가되어있을겁니다~ 여기에는 pom.xml에서 라이브러리 추가한 것이 들어있어요~

이제 Server에 추가한다메 시작하면 톰캣 에러없이 동작할겁니다.

7. war파일 만들기~
프로젝트에 Export해도 되고, mvn으로 명령어를 때려도 됩니다.
[code]mvn package[/code] 때리면 packaging이 war로 되어있어서 war파일이 생성되더군요.
물론 이과정에서 ftp에 배포라던지 그런게 가능한 것 같습니다. 좀 더 연구해보고!

PS. 갑자기 느끼는 생각인데, 이것보다 더 간편한 방법이 있지 않을까 싶기도하고....-_- 후.....

참고자료
http://blog.v-s-f.co.uk/2010/09/jsf-2-1-project-using-eclipse-and-maven-2/
http://maven.apache.org/plugins/maven-eclipse-plugin/

 
Posted by 머드초보

댓글을 달아 주세요

 
https를 아직 이해를 못해서.....-_-
일단 기록용으로-_-













[code]
public class Test extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        StringBuilder content = new StringBuilder();
       
        try
        {
            String data = "userid=???&password=???";
            URL url = new URL("https://url~~");
           
            HttpURLConnection http = null;
           
            if (url.getProtocol().toLowerCase().equals("https")) {
                trustAllHosts();
                HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
                https.setHostnameVerifier(DO_NOT_VERIFY);
                http = https;
            } else {
                http = (HttpURLConnection) url.openConnection();
            }
            http.setDoOutput(true);
            OutputStreamWriter wr = new OutputStreamWriter(http.getOutputStream());
            wr.write(data);
            wr.flush();
           
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(http.getInputStream()));

            String line;

            while ((line = bufferedReader.readLine()) != null)
            {
              content.append(line + "\n");
            }
            Log.i("content", content.toString());
            wr.close();
            bufferedReader.close();
        }
        catch(Exception e)
        {
        }
    }
   
    private static void trustAllHosts() {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[] {};
                }

                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] chain,
                        String authType)
                        throws java.security.cert.CertificateException {
                    // TODO Auto-generated method stub
                   
                }

                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] chain,
                        String authType)
                        throws java.security.cert.CertificateException {
                    // TODO Auto-generated method stub
                   
                }
        } };

        // Install the all-trusting trust manager
        try {
                SSLContext sc = SSLContext.getInstance("TLS");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                HttpsURLConnection
                                .setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
                e.printStackTrace();
        }
    }
   
    final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };
}
[/code]
 
Posted by 머드초보

댓글을 달아 주세요

  1. 승군 2010.11.05 16:51 신고  댓글주소  수정/삭제  댓글쓰기

    머드초보님 코드 덕분에 제가 살았습니다.
    정말 감사합니다 ㅠㅠ

    • 머드초보 2010.11.05 21:21 신고  댓글주소  수정/삭제

      아~ 도움이 되셔서 다행이네요
      저도 이거 https요청에 대해서 구글링한거 그냥 적어놓은거라는^^
      방문해주셔서 감사해요~

  2. BlogIcon 도플광어 2010.11.30 17:16 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 저도 살앗네요^^;

  3. 초보개발자 2011.07.04 21:25 신고  댓글주소  수정/삭제  댓글쓰기

    오호~ 저도 잘몰라서 이것저것 했는데 실패했는데
    이걸로 성공했네요ㅠㅠ
    좋은 소스 감사합니다^^

 
HttpClient 4.x버전으로 올라오면서 조쿰 바뀐 것 같습니다.
기록용으로 기록합니다-_-
아래 예제는.....티월드사이트의 무료사용량 조회 예제입니다-_-










[code]
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        HttpClient httpclient = new DefaultHttpClient();
       
        String id = "t월드 아이디";
        String pw = "비밀번호";
       
        List<NameValuePair> qparams = new ArrayList<NameValuePair>();
        qparams.add(new BasicNameValuePair("URL", "http://www.tworld.co.kr/loginservlet.do?returnURL=http%3A%2F%2Fwww.tworld.co.kr&kind=&popup=&cmd=&reload=&ID=" + id));
        qparams.add(new BasicNameValuePair("ID", id));
        qparams.add(new BasicNameValuePair("PASSWORD", pw));
        qparams.add(new BasicNameValuePair("SERVERIP", "203.236.20.129"));
        qparams.add(new BasicNameValuePair("X", "0"));
        qparams.add(new BasicNameValuePair("Y", "0"));
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(qparams, "UTF-8");
        HttpPost httpPost = new HttpPost("http://nicasams.sktelecom.com:2040/icas/fc/LogOnSV");
        httpPost.setEntity(entity);
       
        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        String responseBody = "";
        HttpResponse response = httpclient.execute(httpPost);
        Header[] headers  = response.getAllHeaders();
        httpclient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet();
        if (headers.length > 1){
            String url = headers[1].getValue();
            System.out.println("url = " + url);
            httpGet.setURI(new URI(url));
            responseBody = httpclient.execute(httpGet, responseHandler);
            System.out.println(responseBody);
        }
        httpGet.setURI(new URI("http://www.tworld.co.kr/normal.do?serviceId=S_BILL0070&viewId=V_CENT0261"));
        responseBody = httpclient.execute(httpGet, responseHandler);
       
        System.out.println("result = " + responseBody);
    }
}
[/code]

 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 이창우 2011.12.10 11:45 신고  댓글주소  수정/삭제  댓글쓰기

    4.0 으로 오면서 org.apache.commons.httpclient 패키지가 통으로 사라져서 애먹고 있었는데

    예제 감사합니다.

 
안드로이드는 개발환경 구축이 좀 빡세네요.
Java는 원래 다 그런 것인가....-_- 자바는 셋팅이 반이라는 말이 있는데, 이놈은 셋팅도 다시 해야하고, 사실 언어만 java지 안드로이드에 맞는 class와 구조를 다시 배워야하는 거라 자바를 좀 안다는 사람이나 자바를 전혀 모르는 사람이나 뭐 차이가 없습니다.

그리고, AVD(Android Vritual Device)라고 해서 가상 에뮬레이터에서 실행할 수 있고, 모토로이에서도 실행할 수 있는데, 일단 가상에뮬레이터는 좀 느립니다. EditText부분에 글을 쓸 때 반응속도가 너무 느려서 짜증이 밀려내려옵니다.
그래서 개발할 때에는 모토로이에서 하고, 테스트할 때에는 에뮬레이터에서 하는 게 정신 건강에 좀 좋을 듯 합니다. 모토로이에서 개발하고 다른 해상도가 틀린 디바이스 때문에 에뮬레이터에서 테스트해줘야겠죠^^
사실 모토로이에서 디버깅하고 개발하는 게 의외로 편하고 잘 되어있습니다. 정말 신기했습니다^^

일단 셋팅에 대한 많은 글들이 있는데요.
http://john.tobe30.com/tc/292
http://blog.naver.com/ksewookk/100099954283
http://ihoney.pe.kr/entry/01-Android-%EC%84%A4%EC%B9%98%EB%B0%A9%EB%B2%95-%EB%B0%8F-%EC%98%88%EC%A0%9C-%EC%8B%A4%ED%96%89

여기 글들을 참조해서 셋팅을 하세요~
아....모토로이는 버전이 2.0.1이 탑재되어있습니다. 참고하세요~

그럼 프로젝트를 만들고 디버깅을 해봅시다.

1. 프로젝트 생성
Android Project -> Project name에는 TestDebug, Build Target은 2.0.1, Application name은 디버깅테스트, package name은 com.mudchobo.testdebug, Create Activity는 TestDebug 후 Finish.

EditText에 이름을 쓰고, Button을 누르면 Hello, 이름 이라는 어플을 만들겁니다.
main.xml파일 수정
[code]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>
<EditText
    android:hint="이름입력하세요"
    android:id="@+id/etHello"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:inputType="textShortMessage"
/>
   
<Button
    android:text="sayHello"
    android:id="@+id/btnHello"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>
<TextView 
    android:id="@+id/tvHello"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
/>
</LinearLayout>
[/code]
AndroidManifest.xml파일을 선택하고, Application탭을 선택하게 되면 Application Attributes에 Debuggable옵션이 있는데 이걸 true로 줘야합니다.

그럼 src -> com.mudchobo.testdebug패키지에 있는 TestDebug.java파일을 수정해봅시다.
[code]package com.mudchobo.testdebug;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class TestDebug extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        // 버튼에 이벤트 추가
        Button btnHello = (Button) findViewById(R.id.btnHello);
       
        // 버튼클릭 시 리스너추가
        btnHello.setOnClickListener(new View.OnClickListener() {
           
            @Override
            public void onClick(View v) {
                // edittext값 가져오기
                EditText etHello = (EditText) findViewById(R.id.etHello);
                String sayHello = etHello.getText().toString();
               
                // 값을 textview에 셋팅
                TextView tvHello = (TextView) findViewById(R.id.tvHello);
                tvHello.setText(sayHello + ", Hello!");
            }
        });
       
    }
}[/code]
그냥 버튼에 이벤트 추가하고, 버튼클릭 시 값가져와서 값을 셋팅하는 초간단 예제입니다.

2. 디버깅 포인트 잡기
EditText etHello~~ 부분에 Ctrl + Shift + B를 누르거나 맨 앞에 더블클릭해서 Break Point를 잡습니다.
그리고 TestDebug에 오른쪽버튼 누르고, Debug As -> Android Application을 선택하면 실행합니다.
AVD가 떠 있다면 떠 있는 곳으로 어플을 설치하며 실행하고, 없으면 직접 AVD를 실행해서 설치하여 실행합니다.
AVD를 미리 띄워놓고 하는 게 정신건강에 좋습니다. 안그러면 프로그램에 끝나는 순간 AVD도 같이 죽어버립니다-_- 나중에 다시 시작하려고 하면 또 AVD를 부팅하는 꼴이 되어버립니다-_-

암튼, 실행하고 EditText에 말을 입력하고 버튼을 누르면 breakpoint에서 멈출겁니다. 이제 디버깅 하면 됩니다.

3. 모토로이에서 디버깅
이제 모토로이에서 실행해봅시다.

일단 모토로이를 디버깅 가능하게 셋팅해야 합니다.
설정 -> 응용프로그램 -> 개발 -> USB 디버깅 체크하셔서 활성화 시켜주세요.

모토로이를 usb에 연결합니다.
그리고 위와 같이 디버깅을 시작합니다. 그러면 이창이 뜰꺼에요.
사용자 삽입 이미지
이미 띄워놓은 AVD로 실행할래? 모토로이로 실행할래 물어보는 것인 듯. AVD를 띄워놓지 않으면 뜨지 않습니다. 바로 모토로이로 디버깅을 하더군요.
사용자 삽입 이미지
와....디버깅이 잘되네요. 에뮬레이터에서 타이핑 테스트하다 야마돌지 마시고, 모토로이에서 디버깅을 하시길-_-

4. 테스트하고 남은 어플 지우기
그리고 테스트하고 남은 어플은 여기서 지우시면 됩니다.
설정 -> 응용프로그램 -> 응용프로그램 관리 -> 디버그테스트(아까 프로젝트 만들 때 Application Name을 찾으면 됩니다. abcd가나다 순이니 참고하시길^^)선택 후 제거하면 됩니다.

PS. 뭐 별것도 없는 글을 장문으로 써버렸네-_-
 
Posted by 머드초보

댓글을 달아 주세요