안드로이드에서 하이브리드 앱을 만들때, 웹뷰에 html 을 불러와서 보여줄때,


html5 Application Cache 기능 적용


1. 안드로이드에서 WebView 에 각종 설정을 세팅해준다.


2. html 코드에서 불러다 쓸 manifest 파일을 만든다.


3. application cache 를 적용할 html 파일에 manifest 코드를 넣는다.




1. 안드로이드 WebView 설정

        webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

        webView.getSettings().setDomStorageEnabled(true);

        String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();

        webView.getSettings().setAppCachePath(appCachePath);

        webView.getSettings().setAllowFileAccess(true);

        webView.getSettings().setAppCacheEnabled(true);



2. manifest 파일 생성(Manifest.appcache) - 그냥 단순한 text 파일. 웬만하면 불러다쓸 html 파일과 동일한 패스에 저장

CACHE MANIFEST

# WithFlick 

# manifest version : v0.1.7 2010.10.10

CACHE:

images/main_menu_info_on.png

images/main_menu_info.png

images/main_menu_mypage_on.png

images/main_menu_mypage.png



3. html 코드 적용

<!DOCTYPE HTML>

<HTML lang="ko" manifest="Manifest.appcache">



※ 동작방식

manifest 파일에 기술된

5개의 이미지 파일은 최초 로딩될때 다운로드 되어져서 캐시에 저장되었다가,


manifest 파일이 변경되면 전체파일을 다시 다운로드해서 새로 저장한다.


사용자들에게 새로 파일을 다운로드하게 하고싶으면, 이미지파일을 교체후에


manifest 파일에 하나의 문자라도 수정을 하면, 변경을 인식하고 새로 다운로드한다.


보통은 version 을 수정한다.


자바스크립트에서 쓸 유용한 이벤트들도 사용할 수 있습니다.

 

예)

    window.applicationCache.addEventListener('downloading', function() {

alert('리소스 다운로드중입니다.');

 }, false);

window.applicationCache.addEventListener('progress', function() {

alert('각각의 리소스 다운로드중입니다.');

 }, false);

window.applicationCache.addEventListener('updateready', function() {

alert("캐싱이 완료되었습니다.");

window.applicationCache.swapCache();

 }, false);



더 자세한 사항은 아래 사이트에 제대로 정리되어있습니다.

참고 : http://xguru.net/621




YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



이클립스에서 안드로이드 프로젝트를 복사하거나

프로젝트를 생성할때, 클래스파일을 만들고 작업하다가

어느샌가 갑자기 파일의 모든 클래스가 임포트 에러가 날 때가 있다.

이건 안드로이드 AVD 가 지정이 되지않아서 나타나는 현상인데,

프로젝트를 선택하고 오른쪽마우스 --> 맨아래 Properties  선택후

android 항목에서 아래그림처럼 원하는 버전을 체크해주면

그지같은 이상한 임포트 에러는 싹 사라질것입니다~ 






YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



안드로이드 플랫폼 HttpPost 요청 처리 구현

(XmlPullParser) 

안드로이드 플랫폼에서 Http 요청을 보내서 값을 받아오는 방법중 

HttpPost, HttpGet, 방식이 있는데, 쓰는방법은 비슷하다.

아무래도 왠만하면 Post 방식을 쓰는게 좋지 않을까 싶다.


예제 구현 방법은 

간단하게 값 2개를  "euc-kr" 로 인코딩해서 Vector에 집어넣고, JSP Page로 보내서 

JSP 페이지에서 지지고 볶은 다음, 안드로이드로 보낼 값들을 XmlPullParser로 받을수있게,

xml 형식으로 내뿜으면

알아서 String 으로 return 됩니다.

그후 리턴값을 XMLPullParser에 집어넣어서 파싱합니다.

 





구현순서 

1. 요청에 필요한 값들을 BasicNameValuePair 형식(key, value)으로 Vector 에 집어넣는다.


2. Vector 를 HttpEntity 생성후 넣는다.


3. HttpPost 인스턴스 생성후 2번에서 만든 HttpEntity 를 .setEntity 한다.(HttpPost 생성시에 생성자로 url을 넣는다)


4. HttpClient 생성후 execute(HttpPost, ResponseHandler) 메소드를 이용해서 요청 날린다.(return 값은 String Type)


5. 리턴 받은 String을 XmlPullParser 생성후  .setInput(new StringReader(결과String))



글 재주가 없어서, 구현순서 설명이 그지같이 됐는데, 

코드를 보면 아주 간단합니다. 

대충 뚝딱뚝딱 하면 잘~ 동작합니다.

(한글 작업이 필요거나, DB에 저장할 때, 형식에 맞게 인코딩 해주면 된다. 2번에서)




이제부터 보실 코드는 위 설명을 읽으신후 보시면

아~~주 간단합니다.

HttpPost 구현이 필요하신분은, 코드를 죽~~ 긁어서 그냥 갔다 쓰시면 됩니다.


`	
	private String sendData(String number, String input) throws Exception {

		HttpPost request = makeHttpPost(number, input, uri);

		HttpClient client = new DefaultHttpClient();
		
		ResponseHandler reshandler = new BasicResponseHandler();
		
		String result = client.execute(request, reshandler);
		
		return result;

	}
	
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

4라인에서 값 2개와 uri 를 makeHttpPost() 로 보내서 request 를 만든후 

client 를 이용해서 execute 하면 String 으로 리턴됩니다. 




makeHttpPost 메소드
`	
	private HttpPost makeHttpPost(String number, String input, 
									String url) throws Exception {
		
		HttpPost request = new HttpPost(url);
		
		Vector nameValue = new Vector();
		
		nameValue.add(new BasicNameValuePair("NUMBER", number));
		nameValue.add(new BasicNameValuePair("INPUT", input));
		
		request.setEntity( makeEntity(nameValue) );
		
		return request;
	}

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

17라인은 무시하세요..ㅠㅠ 저거 자동으로 태그닫는거 없애는거 아시는분좀 갈켜주세요

12라인에서  request 에   makeEntity()를 이용해서 HttpEntity 를 만들면서 집어넣습니다.

 


makeEntity 메소드
`		
	private HttpEntity makeEntity(Vector nameValue) 
													throws Exception {
		HttpEntity result = null;
		
		try {
			
			result = new UrlEncodedFormEntity(nameValue, "euc-kr");
			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		return result;
	}



이렇게 3개의 메소드를 이용해서 요청에 필요한 작업을 한후,

요청을 하면 uri 에서 요청을 받아들인후 http로 결과값이 뿌려지면 그대로

그 값이 String 으로 담아지게 됩니다.

그냥 어디 홈페이지에 요청을 하게되면, 그 페이지가 쭉 다 긁혀오겠지요

여기까지가 안드로이드 플랫폼에서 HttpPost 를 이용해서 요청한후

결과값 받아오는 모든 과정입니다.

결과값이 그냥 String 으로 하나만 써먹을 경우에는 그냥 쓰면 되겠지만


보통은 여러가지 값을 이용해야 하는데,

그러기 위해서 태그를 써서 XML 형식으로 값을 받은후에

파서로 값을 잘라서 구분한 후 이용해야합니다.  

!! 주의할점은 파싱할 때, 구분이 문자는 '<' 문자이기 때문에,

태그가 열리는 '<' 가 아닌, 내용중에 '<' 가 포함되어 있으면, 파서에서 Exception 이 발생하게됩니다.

그렇기 때문에, XmlPullParser 를 이용하실 때는 내용중에 '<' 기호가 포함되지 않도록, 주의 하셔야 합니다. 
 




XmlPullParser
`
    XmlPullParserFactory factory = null;
	XmlPullParser xpp = null;
		
	private void search(String input) throws Exception {
		
		factory = XmlPullParserFactory.newInstance();
		factory.setNamespaceAware(true);
		xpp = factory.newPullParser();

		xpp.setInput(new StringReader(input));
		int eventType = xpp.getEventType();
		String sTag = "";

		while (eventType != XmlPullParser.END_DOCUMENT) {
		
			Result_ListBean resultList = null;
			
			switch (eventType) {
			
			case XmlPullParser.START_DOCUMENT:
				break;
			
			case XmlPullParser.END_DOCUMENT:
				break;
			
			case XmlPullParser.START_TAG:
				sTag = xpp.getName();

				if (sTag.equals("number")) {
					eventType = xpp.next();
					number = xpp.getText();
				} else if (sTag.equals("aim")) {
					eventType = xpp.next();
					aim = xpp.getText();
				} else if (sTag.equals("date")) {
					eventType = xpp.next();
					date = xpp.getText();
				} else if (sTag.equals("text")) {
					eventType = xpp.next();
					text = xpp.getText();
				} else if(sTag.equals("data")) {
					eventType = xpp.next();
					DataShare.totalListCount = Integer.parseInt(xpp.getText());
				}
				break;
				
			case XmlPullParser.END_TAG:
				if (xpp.getName().equals("person")) {
					resultList = new Result_ListBean(id, number, area1, area2,
							area3, kind, writer_gender, aim, target_gender,
							deposit, rent_money, date, text);
					list.add(resultList);
				}
				break;
				
			case XmlPullParser.TEXT:
				break;
			}
			eventType = xpp.next();
		}// while end;
				
	}


YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. jdk 2012.09.12 10:25 신고  댓글주소  수정/삭제  댓글쓰기

    좋은자료 감사합니다 ^^

  2. 데르벨준 2012.11.23 22:46 신고  댓글주소  수정/삭제  댓글쓰기

    정말 도움이 많이 됬어요 ㅠㅠ 감사합니다!



<alpha>
 fromAlpha : 0.0 ~ 1.0 // 0.0 투명
 toAlpha : 0.0 ~ 1.0 // 0.0 투명
 
<scale>
 fromXScale : X의 시작 크기
 toXScale : X의 끝 크기
 fromYScale : Y의 시작 크기
 toYScale : Y의 끝 크기 
 pivotX : X 좌표의 중심점
 pivotY : Y 좌표의 중심점 
 
<tanslate>
 fromXDelta : X의 시작 위치
 toXDelta : X의 끝 위치
 fromYDelta : Y의 시작 위치
 toYDelta : Y의 끝 위치 

<rotate>
 fromDegrees : 회전 시작 각도
 toDegrees : 회전 끝 각도
 pivotX : 회전 중심 X 좌표
 pivotY : 회전 중심 Y 좌표  

<interpolator>
 duration : 효과 시간 1/1000초 단위
 startOfSet :  효과 오프셋 시작시간 1/1000초 단위
 fillBefore : true로 설정하면 시작되기 전 애니메이션 변형 적용
 repeatCout : 반복 횟수
 repeatMode : 반복횟수가 0 보다 클때 효과가 끝나는 시점의 동작 지정 => restart, reverse
 zAdjustment : Z 축 지시모드 => normal, top, bottom
 interpolator : 각각 엘리먼트들을 효과 시간동안 어떻게 나타낼 것인지 지정 => @android:anim/interpolatorName 사용

* 알파 : 서서히 나타나는 에니메이션으로 스플래시 윈도우나 뷰들을 자연스럽게 나타나고자

할때 사용된다.(알파값을 반대로 하면 서서히 사라짐)

<alpha xmlns:android="http://schemas.android.com/apk/res/android"

android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0"

android:toAlpha="1.0"

android:duration="@android:integer/config_longAnimTime" />

 

* 이동

<translate

android:fromXDelta="100%p" android:toXDelta="0"
android:duration="@android:integer/config_shortAnimTime" />

 

* 왼쪽으로 이동하며 서서히 나타남

<set xmlns:android="http://schemas.android.com/apk/res/android">

<translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="300"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />

</set>

 

* 왼쪽으로 이동하며 서서히 사라짐

<set xmlns:android="http://schemas.android.com/apk/res/android">

<translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="300"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" />

</set>

 

* 위로 이동하며 나타나기

<set xmlns:android="http://schemas.android.com/apk/res/android">

<translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="300"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />

</set>

 

* 7번 흔들기

<translate xmlns:android="http://schemas.android.com/apk/res/android"

android:fromXDelta="0" android:toXDelta="10" android:duration="1000" android:interpolator="@anim/cycle_test"/>

 

* 스케일

<set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/decelerate_interpolator">
    <scale android:fromXScale="2.0" android:toXScale="1.0"
           android:fromYScale="2.0" android:toYScale="1.0"
           android:pivotX="50%p" android:pivotY="50%p"
           android:duration="@android:integer/config_mediumAnimTime" />
</set>

 

* 스케일 + 알파를 사용한 축소되며 사라지기
<set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:zAdjustment="top">
    <scale android:fromXScale="1.0" android:toXScale=".5"
           android:fromYScale="1.0" android:toYScale=".5"
           android:pivotX="50%p" android:pivotY="50%p"
           android:duration="@android:integer/config_mediumAnimTime" />
    <alpha android:fromAlpha="1.0" android:toAlpha="0"
            android:duration="@android:integer/config_mediumAnimTime"/>
</set>

 

* 서서히 나타나며 원래 크기보다 커졌다가 원래크기로 돌아가는 에니메이션

<set xmlns:android="http://schemas.android.com/apk/res/android"

android:interpolator="@android:anim/accelerate_interpolator">
 <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        android:duration="100" />
  <scale
        android:fromXScale="0.5" android:toXScale="1.5"
        android:fromYScale="0.5" android:toYScale="1.5"
        android:pivotX="50%" android:pivotY="50%"
        android:duration="200" />
  <scale 
        android:fromXScale="1.5" android:toXScale="1.0"
        android:fromYScale="1.5" android:toYScale="1.0"
        android:pivotX="50%" android:pivotY="50%"
        android:startOffset="200"
        android:duration="100" />

</set>

 

* 레이아웃 에니메이션 : 레이아웃에 포함된 각 뷰들이 보여지는 에니메이션 설정

<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
        android:delay="0.5"
        android:animationOrder="random"
        android:animation="@anim/설정할 에니메이션" />

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST