참조의 강한 정도 : Strong > Soft > Weak > Phantom


Strong References

일반적인 객체 참조를 말함 

일반적으로는 gc에도 정리되지 않지만 항상 그렇진 않다.

예) Server svr = new Server();


Soft References

WeakReference와 비슷하나 gc에 정리될 가능성이 적다

VM이 OOM가 발생할 것같으면 정리함, 최대한 늦게 정리


Weak References

메모리에 머물지 않고, 다음 gc때 정리 대상

예) WeakReference<Cachable> weakData = new WeakReference<Cacheable>();

다시 쓸려고 할때 항상 null 체크 유의


Phantom References

참조중 가작 약한 참조, get 하면 항상 null 나옴

ReferenceQueue는 죽은 참조의 상태를 관리

WeakReference는 finalized 또는 gc 전에 ReferenceQueue에  enqueuing되는 반면(살릴수있다)

PhantomReference는 finalized 또는 gc 후에  ReferenceQueue에  enqueuing된다.

좋은 점은 개발자가 메모리로 부터 객체 제거를 확실히 결정하게 해준다.(예로 큰이미지 다룰때)

실제로는 거의 사용하지 않음



참고자료

http://stackoverflow.com/questions/3329691/understanding-javas-reference-classes-softreference-weakreference-and-phanto


http://www.rallydev.com/community/engineering/java-references-strong-soft-weak-phantom


https://weblogs.java.net/blog/2006/05/04/understanding-weak-references



Posted by 빈솔B
,

http://git-scm.com/download/win




http://stackoverflow.com/questions/20923193/bitbucket-windows-and-fatal-could-not-read-password-for

Posted by 빈솔B
,

The free plan of Bitbucket supports unlimited private or public Git/Mercurial repositories and up to 5 users.


http://stackoverflow.com/questions/2378120/is-there-a-free-private-git-repository

Posted by 빈솔B
,

http://www.cnet.co.kr/view/23797

Posted by 빈솔B
,

이런 문제에 걸리면 돌부리에 넘어진 것처럼 바쁜 일정에 힘이 빠질때가 있습니다.

제가 만들고자 했던건 

FragmentActivity > Fragment > Activity

즉 Fragment에서 startActivityForResult 로 Activity를 호출뒤 작업완료 후 돌아왔을때

onActivityResult에서 무언가를 할경우 그 무언가의 작업에 따라 제목과 같은 에러가 발생할 수 있습니다.

저 같은 경우에는 또다른 Fragment 로 스위칭 작업을 하는것이 었는데요.

구글링해보니 다이얼로그를 띄우것과 같은 UI관련 작업이 있으면 발생하는 것 같습니다.(시간내서 확인 정확히 해보겠습니다)


여튼 구글링 결론은 이렇습니다. 

1. 원인은 이렇게 설명하고 있습니다.

The bug is that onActivityResult() is called before onStart().


그래서 메세지 의미를 해석해 보면 onSaveInstanceState 이후에 이런 액션(본인의 경우 다른 플래그먼트 호출)을 할수 없다라는 말은 현재 onActivityResult()가 onStart() 작업이 해주는 플래그먼트 상태 복원작업이 되기 이전에 해당 작업은 할수 없다라고 이해가됩니다.


void onSaveInstanceState(Bundle outState)

Called to ask the fragment to save its current dynamic state, so it can later be reconstructed in a new instance of its process is restarted.


2.OS 버그다. 아니다. 논란이 있습니다. 그래서 패치중이다란 의견도 있구요

3. 해결방법은 아래에서 참고하다시피 다양히 제시되고 있습니다.

https://code.google.com/p/android/issues/detail?id=17787

http://stackoverflow.com/questions/10114324/show-dialogfragment-from-onactivityresult


제가 사용한 방법은 다음과 같습니다. 예제입니다.

    @Override

    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {

            case Constants.REQUEST_CODE_CERTIFICATION:

                if (resultCode == getActivity().RESULT_OK) {

                    String realName = data.getStringExtra(Constants.INTENT_DATA_REAL_NAME);

                    Log.d(TAG, "realName:"+realName);

// 에러가 발생했던 코드

//                    SignUpStep3Fragment fragment = new SignUpStep3Fragment(realName);

//                    switchFragment(fragment);


// commitAllowingStateLoss 를 사용해서 상태잃어버리는 것을 허용하는 꼼수

                    SignUpStep3Fragment fragment = new SignUpStep3Fragment(realName);

                    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();

                    ft.replace(android.R.id.content, fragment);

                    ft.addToBackStack(null);

                    ft.commitAllowingStateLoss();

                }

        }

    }


 마무리하며..

제시된 방법은 아직은 불완전해보이는 Fragment 라이프사이클을 보완하기 위한 임시방편 책으로 보입니다.

OS 버전 업데이트가 되면 좀더 안전한 Fragment 사용이 되지 않을까 생각됩니다.




Posted by 빈솔B
,

IntelliJ 단축키 

alt + Enter : 패키지를 import  한다.


Posted by 빈솔B
,

어떻게 하면 안드로이드에서 비디오 파일을 재생시 오디오만 재생가능하게 할 수 있을까요?

답은 안드로이드 문서에 있습니다.

http://developer.android.com/reference/android/media/MediaPlayer.html

public void setDisplay (SurfaceHolder sh)

Added in API level 1

Sets the SurfaceHolder to use for displaying the video portion of the media. Either a surface holder or surface must be set if a display or video sink is needed. Not calling this method or setSurface(Surface) when playing back a video will result in only the audio track being played. A null surface holder or surface will result in only the audio track being played.

Parameters
shthe SurfaceHolder to use for video display

setDisplay 를 null로 주거나 세팅안하시면됩니다.

그런데 테스트 해보니 재생을 다시 시작해야 되는 이슈가 있구요

로컬 비디오 파일에 대해서는 재생이 오류나는 경우가 있습니다. error -38,0

그래서 일단은 초기 재생시 일반 재생또는 오디오모드 재생으로만 구현했습니다.



Posted by 빈솔B
,

안드로이드 개발중 파일을 저장할 이슈가 생겼습니다.

파일을 어디에 저장하느냐


String filePath = getActivity().getFilesDir().toString()+"/download/"+파일id

로 저장했다가 읽을 때 젤리빈에서는 문제없었으나

그 이하 버전에서 에러 메세지 발생

갤럭시S 2.3.3

04-11 14:03:55.660: E/MediaPlayer(1000): error (-4, -4)

갤럭시S3 4.0.4
04-11 14:07:51.610: E/MediaPlayer(13003): error (1, -2147483648)

구글링해보니 그런 사례가 좀 있는 듯

아시다시피 저장 방법 3 가지
1. Internal storage [ /data/data/your.package.name/files; ie. context.getFilesDir() ]
2, External application storage [ /mnt/sdcard/Android/data/package_name/files/Music; ie. context.getExternalFilesDir(null) ]
3. External general storage [ /mnt/sdcard/temp; ie. Environment.getExternalStorageDirectory() + "/temp" ]


일단 모든 버전 지원을 위해 
2번 방법으로 가기로 했습니다.



Posted by 빈솔B
,


첨엔 이게 머지? 오늘 무슨 날인가? 하고 구글 로고를 클릭해봤더니 글쎄 

헐;; 대박. 내 구글 플러스 페이지가 나온다...

유저의 생일도 깨알같이 챙기는 구글.. 아.. 이런게 서비스구나..

티비팟에도 해봐야겠다 ㅋㅋ

Posted by 빈솔B
,

용어정리


필자도 첨엔 헷갈렸으나 결론은 비슷한 용업디다;


Action Bar ≒ System Bar

기존에 타이틀 바가 바뀐 형태로 3.0 허니콤부터 생겼다.

메뉴바로도 사용가능하고 하드웨어키도 대체 가능하다.

Beginning with Android 3.0 (API level 11), 

http://developer.android.com/guide/topics/ui/actionbar.html


그럼 어느 용어가 표준인가?

http://developer.android.com/design/get-started/ui-overview.html


아이러니 하게도 사용되는 방법에 따라 다르게 불리고 있다;

정리가 필요할듯 한데;


의미상으로는 

Navigation Bar ≒ System Bar

Combined Bar ≒ Action Bar

같다.. 내 생각이다


틀리다고 생각되시면 댓글로 답변좀;;

나중에 정리되면 다시 수정하겠습니다

Posted by 빈솔B
,