** 문제점

Picasso 클래스의 into 메소드의 파라미터를 Target으로 주는 경우, onPrepareLoad 메소드까지만 실행되고 onBitmapLoaded는 안 되는 문제


** 원인

Target이 weak reference이기 때문에 메모리에서 지워짐.


** 해결 방법

빈 ImageView를 생성 후 해당 ImageView에 Target을 tagging한다. 이후 사용할 때는 태그를 불러와서 사용.


ImageView iv = new ImaveView(context);

iv.setTag(new Target () { ... });


Picasso.get().load(imgUrl).into((Target)iv.getTag());


참고 : 

https://stackoverflow.com/questions/24180805/onbitmaploaded-of-target-object-not-called-on-first-load#answers

http://itmining.tistory.com/10 - [IT 마이닝] [안드로이드] 안드로이드 메모리 관리 (Weak Reference와 Soft Reference)



** Picasso





사용 방법 : 


Picasso

.with(context)

.load(imgUrl)

.transform(new BlurTransformation(context, mRadius))

.into( ... );




** Glide





사용법 : 


RequestOptions options = new RequestOptions();

options.centerCrop();

options.override(width, height);

options.transform(new BlurTransformation(context, mRadius));


Glide.with(context).setDefaultRequestOptions(options).asBitmap().load(imgUrl).into( ... );






** 참고

http://dwfox.tistory.com/48

https://github.com/wasabeef/glide-transformations/blob/master/transformations/src/main/java/jp/wasabeef/glide/transformations/BlurTransformation.java#L74

** 문제점

PreferenceManager를 사용하여 SharedPreference를 저장했을 때, 해당 앱을 삭제 후 재설치해도 기존의 SharedPreference가 남아있던 문제가 있었음.



** 해결 방법

Manifest 파일에서 <application> 태그 내부에 아래와 같은 속성을 추가한다.

(아예 자동 백업&불러오기를 사용하지 않음)


<application

...

android:allowBackup="false"


...

>

</application>


** 참고

https://developer.android.com/guide/topics/data/backup

https://developer.android.com/guide/topics/data/autobackup

https://stackoverflow.com/questions/15873066/how-to-remove-shared-preference-while-application-uninstall-in-android

정확하지 않으니 대략적인 값으로만 참고하세요 :) 


갤럭시 뷰 18인치

1920*1080  180dpi


갤럭시 탭 10.1인치

1280*800  160dpi


갤럭시 탭A 9.7 인치 

1024*768  132dpi


갤럭시 탭A 7인치

1280*800  188dpi

1. 레이아웃 애니메이션 넣기

https://proandroiddev.com/enter-animation-using-recyclerview-and-layoutanimation-part-1-list-75a874a5d213


** <layoutAnimation> 요소에 duration 속성을 지정하지 않으면 애니메이션이 실행되지 않음.


2. 각 셀마다 애니메이션 나오게 하기

어댑터 안의 onBindHolder 내에 아래의 코드 삽입

(lastPosition은 어댑터 클래스의 전역 변수이며 초기값은 0 또는 -1)


if(position != lastPosition){

    Animation animation;

    if(position > lastPosition && position != 0) {

        animation = AnimationUtils.loadAnimation(holder.itemView.getContext(), R.anim.anim_slideup);    //아래로 스크롤 시 보여질 애니메이션

    }else{

        animation = AnimationUtils.loadAnimation(holder.itemView.getContext(), R.anim.anim_slidedown);    //위로 스크롤 시 보여질 애니메이션

    }

    holder.itemView.startAnimation(animation);

    lastPosition = position;

}


** 아이템을 추가 또는 삭제 할 때 lastPosition을 해당 아이템의 position으로 설정하면 추가/삭제 시 애니메이션 발생하지 않음.

ex )

private void add(int index, TextData data) {

    //데이터베이스에 데이터 넣기(단일)

    lastPosition = index;

    dataList.add(index, data);

    notifyItemInserted(index);

}


private void remove(TextData data) {

    //데이터베이스에서 데이터 지우기(단일)

    int removeIndex = dataList.indexOf(data);

    lastPosition = removeIndex;

    dataList.remove(removeIndex);

    notifyItemRemoved(removeIndex);

}


3. 기본 추가/삭제 애니메이션이 보여지길 원한다면.. 

notifyItemInserted, notifyItemRemoved를 적용(위의 코드의 파란색 형광펜 참조)

+ Recent posts