달력

1

« 2021/1 »

  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  
  •  
2013. 3. 25. 20:12

Android 의 WebView pinch zoom 없애기 Android2013. 3. 25. 20:12

까먹을까봐 올린다;;

웹뷰의 onTouchEvent 를 Overriding 해서 처리한다.

@Override
 public boolean onTouchEvent(MotionEvent event) {

if (event.getPointerCount() > 1) {
   getSettings().setBuiltInZoomControls(true);
   getSettings().setSupportZoom(true);
  } else {
   getSettings().setBuiltInZoomControls(false);
   getSettings().setSupportZoom(false);
 }
  return super.onTouchEvent(event);
 }

Posted by maruldy

댓글을 달아 주세요

strings.xml 에 html tag 를 넣어서 리소스를 작성하다 보면, &lt &gt 등을 이용해서 처리하던 <. > 등 때문에

가독성이 심각하게 떨어져 보일 수 있다.

 

이를 위해서 CDATA 를 사용하면 가독성을 확보할 수 있다.


<string name="string_hello">&lt;/font&gt;&lt;font color="#535353"&gt;안녕하세요&lt;/font&gt;</string>

 

로 사용되던 작성법은 아래와 같은 방법으로 작성될 수도 있다.

 

<string name="string_hello"><![CDATA[

<font color="#535353">안녕하세요 %1$s</font>

]]></string>

 

들여쓰기는 팀의 convention 에 맞춰도 되고 딱히 없다면 본인이 보기 편한대로 하면 될 것이다.

 

Java 에서 위 resource 를 사용하는 법은 아래와 같다.

 

String string = getResources().getString(R.string.string_hello, "대영님"); 

helloTextView.setText(Html.fromHtml(string));

Posted by maruldy

댓글을 달아 주세요

2013. 2. 1. 16:36

Android 메모리 관리 링크 Android2013. 2. 1. 16:36

http://aroundck.tistory.com/378

 

까먹을까봐 ;;

Posted by maruldy

댓글을 달아 주세요

  1. 2013.04.16 05:04  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

2012. 11. 20. 17:00

Java volatile 키워드 정리. Java2012. 11. 20. 17:00

Java Language Specification 에 나온 내용을 기반으로 설명함.

 

8.3.1.4 volatile Fields


The Java programming language allows threads to access shared variables (§17.1).
As a rule, to ensure that shared variables are consistently and reliably updated, a
thread should ensure that it has exclusive use of such variables by obtaining a lock
that, conventionally, enforces mutual exclusion for those shared variables.
The Java programming language provides a second mechanism, volatile fields,
that is more convenient than locking for some purposes.
A field may be declared volatile, in which case the Java Memory Model ensures
that all threads see a consistent value for the variable (§17.4).8.3.1 Field Modifiers CLASSES

It is a compile-time error if a final variable is also declared volatile.

 

일단 위를 번역, 의역해보자..

 

자바는 thread 들이 공유된 변수에 접근하는 것을 허용한다.
일반적으로는(Java 뿐 아닌 다른 언어에 대해서도), Thread 간에 공유된 변수들의 일관성 있고 확실한 업데이트(데이터의 변경)를 하기 위해,

thread 는 이러한 변수들을 독점적으로 얻기 위한 방법으로 mutex 를 적용하곤 했다.

(여러 Thread 가 같은 변수에 한번에 접근하지 않기 위해서 Mutual Exclusion 처리를 해주고 있다는 말임.)


자바에서는 이에대해 좀더 쉬운 방법인 volatile field 라는 또 다른 방식을 제공한다.
field 가 volatile 을 이용해서 선언이 되었을 경우에,

자바 메모리 모델은 해당 변수에 대해 모든 쓰레드가 일관된 값을 사용할 것을 보장한다.
만약에 final 과 volatile 혼용해서 쓴다면 컴파일 시점에 오류가 발생하게 된다.

 

좀더 자세히 살펴보자..

 

1. Thread 간에 변수가 공유되면, Thread 는 그 값을 복사해 놓은 후, 복사한 값을 참조해서 사용한다.


Java 에서는 Thread 를 사용할 때 performance 향상을 위해 해당 변수의 값을

Thread 가 사용하는 메모리 영역에 caching 하는 것을 허용한다.


예를 들면, ThreadA 와 ThreadB 라는 두개의 쓰레드가 foo 라는 변수를 바라보고 있을 때,

foo 라는 변수를 각각 쓰레드의 로컬 메모리영역에 caching 해서 사용을 하는 식이 된다.


따라서, ThreadA 가 foo 라는 변수의 값을 "abc" 에서 "def" 로 바꾼다고 하더라도

어느 시점에는 ThreadB 는 여전히 "abc" 라는 값을 가지고 있을 수 있다.

(간단한 테스트 코드로도 확인 가능하다.)

 

이러한 문제를 극복하기 위해 volatile 이라는 키워드를 사용해서 변수를 선언하게 되면,

각 Thread 들은 foo를 caching 하지 않고, foo를 사용할 때마다 메인메모리 영역의 foo 를 바라본다.

위 글을 읽다 보면 final 과 volatile 은 같이 사용이 불가능 하다는 구문이 나오는데,

내 생각에는 final 은 변수가 바뀌지 않는다는 것을 전제도 하는 키워드이지만,

volatile 은 변수가 바뀌는 것을 전제로 하는 키워드이기 때문에 둘을 혼용해서 쓸 수 없는 것 같다.

2. Thread 간에 공유된 변수에 한 Thread 가 접근하면, 다른 Thread 는 접근하지 못한다.

 

예를들면 4바이트 이상의 변수인 long 을 변경한다고 했을 때, 앞 4바이트와 뒤 4바이트를 나눠서 변경한다.

예를들면 long 값을 21521542 에서 463634110 으로 변경시킨다고 했을 때, 앞 4바이트를 변경하고 뒤 4바이트를 변경한다.

 

이게 어떤 결과를 야기시킬 수 있냐면, 

여러 ThreadA 가 long 값을 변경시키고 있는 와중에도 ThreadB 가 long 에 접근하면,

ThreadB 는 21521542 도 아니고 463634110 도 아닌 전혀 다른 값을 출력할 수 있다는 얘기다.

 

그 값의 정체는 앞4바이트 값은 바뀌고 있는데 뒤 4바이트는 예전의 값인, 두 숫자가 혼합된 값이 나올수도 있다는 얘기다.

(int 같은 경우에는 어차피 4바이트 변수니까 해당사항이 없긴 하다.)

 

내가 알아본 volatile 키워드의 효과는 위에 적은 두가지다.

까먹지 말고 잘 사용합시다~ :)

Posted by maruldy

댓글을 달아 주세요

2012. 9. 25. 11:32

Android WebView 속도 향상 Android2012. 9. 25. 11:32

LOAD_NO_CACHE 나 기타 많이 알려진 다른 방법으로도 속도 개선이 안된다면

webview.getSettings().setRenderPriority(RenderPriority.HIGH);

를 사용해봅시다.

Posted by maruldy

댓글을 달아 주세요

그동안 잘 써왔던, 하지만 메소드가 @hide 되어있어서 reflection 을 이용해서 사용해 왔던 WebView.SetEmbeddedTitleBar 메소드가 Jelly Bean 에서는 사라지고 없다.

하지만 Android Developer 사이트에 기고된 컬럼처럼 Backward Compatibility 가 되도록 구현해주자.

public void setEmbeddedTitleBar(WebView webView, View titlebar) {
    try {
        Method method = WebView.class.getMethod("setEmbeddedTitleBar", new Class[] {View.class});
        method.invoke(webView, titlebar);
    } catch (Exception ex) {
      webView.addView(titlebar,new AbsoluteLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0));

        ex.printStackTrace();
    }
}

Posted by maruldy

댓글을 달아 주세요

  1. lee 2013.03.07 10:57  댓글주소  수정/삭제  댓글쓰기

    덕분에 젤리빈에서 타이틀을 넣었습니다. 근데... 웹뷰와 겹쳐서 들어가네요... 이걸 해결할 방법이 없을 까요... 웹뷰 위에다 그려버리니... 음....

    • maruldy 2013.03.11 17:39 신고  댓글주소  수정/삭제

      안녕하세요, 혹시 본문 코드에 문제점이 있다면 Apache License 2.0 으로 공개된 아래 코드에서 한번 확인해 보시기 바랍니다.
      직접 테스트 해보고 수정해서 올리고 싶은데 업무시간이라 여의치가 않네요.. ^^; 양해 바랍니다.

      url 은 아래와 같습니다
      http://code.google.com/p/android-titlebar-webview/source/browse/trunk/TitleBarWebView.java?r=2

      private void setEmbeddedTitleBarJellyBean(View) 메소드를 확인해 보시면 됩니다.

삼성 런처에서만 된다.. -_-

 

Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");

intent.putExtra("badge_count", 10);

intent.putExtra("badge_count_package_name", 패키지명);

intent.putExtra("badge_count_class_name", 클래스명);


sendBroadcast(intent);

 

Posted by maruldy

댓글을 달아 주세요

  1. 행인 2012.10.09 11:23  댓글주소  수정/삭제  댓글쓰기

    정보 감사합니다 ㅎ

ViewTreeObserver vto = view.getViewTreeObserver();

vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

    @Override

    public boolean onPreDraw() {

        int width = view.getWidth();

        int height = view.getHeight();

        ViewTreeObserver vto = mImageView.getViewTreeObserver();

        vto.removeOnPreDrawListener(this);

        return false;

    }

});

Posted by maruldy

댓글을 달아 주세요

일전에, 공개되지 않은 WebView 의 Method 인 setEmbeddedTitleBar() 메소드를 사용하는 법을 알아다.

 

두가지 정도 내용을 더 추가하자면,

1. 화면 하단에 (-/+) 같은 줌 버튼이 생기는데, 이게 미관상 좋지 않다.

이 부분을 없애려면 Webiew 를 상속받아서 onTouchEvent 를 Overriding 하면 된다.

@Override
 public boolean onTouchEvent(MotionEvent motionEvent) {
  final int eventAction = motionEvent.getAction();
  if (eventAction == MotionEvent.ACTION_DOWN ||
   eventAction == MotionEvent.ACTION_POINTER_DOWN ||
   eventAction == MotionEvent.ACTION_POINTER_1_DOWN ||
   eventAction == MotionEvent.ACTION_POINTER_2_DOWN ||
   eventAction == MotionEvent.ACTION_POINTER_3_DOWN ||
   eventAction == MotionEvent.ACTION_MOVE) {
   if (motionEvent.getPointerCount() > 1) {
    getSettings().setBuiltInZoomControls(true);
    getSettings().setSupportZoom(true);
   } else {
    getSettings().setBuiltInZoomControls(false);
    getSettings().setSupportZoom(false);
   }
  }
  return super.onTouchEvent(motionEvent);
 }

 

2. TitleBar 를 포함한 WebView 의 영역과 별개의 영역에 Layout 을 구성하면, 해당 WebView 의 Zoom 등에 영향을 받지 않는다

 

이정도를 적용 시키니 한층 화면 보기가 좋아졌다.

 

Posted by maruldy

댓글을 달아 주세요

TimeZone.getDefault().getOffset(기준시간); 로 값을 얻어오면
offset 을 얻을 수 있는데 이게 역시 currentTimeMillis 로 들어온다.

이걸 기준시간에 더해버리면 현재 지역의 시간을 얻을 수 있다.

Posted by maruldy

댓글을 달아 주세요