Glide Library를 이용하여 이미지를 로딩할 때, 아래와 같은 Exception이 발생하신 분은 한번 참고해보세요.
Exception이 발생하지 않더라도 안정성을 위해 한번 보셔도 나쁘지 않을 듯 합니다.
Fatal Exception: java.lang.RuntimeException: Error receiving broadcast Intent { act=refresh_main_navi_event flg=0x10 } in
com.package.activity.user.MainActivity$6@283944fc
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:933)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5951)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:134)
at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:125)
at com.bumptech.glide.Glide.with(Glide.java:641)
...
빈번도가 그리 높지 않은 Exception이라 무시하고 지나갈 경우가 있습니다.
우선 Exception이 발생 한 이유는 Activity가 끝난 상태에서 Glide with 함수를 호출해서 발생한 문제 입니다.
그래서, Glide 를 사용할 때 아래와 같이 코딩하시면 좋을 듯 합니다.
## Activity
public RequestManager mGlideRequestManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGlideRequestManager = Glide.with(getActivity());...
view.post(new Runnable() {
@Override
public void run() {
mGlideRequestManager.load(imgpath)
.asBitmap().into(view);
}
});}
OnCreate 함수 내에서 load 함수를 쓰고자 할 경우는 Runnable 로 이용하라고 합니다.
## Fragment
public RequestManager mGlideRequestManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGlideRequestManager = Glide.with(this);
}
위 상태로 초기화를 한 후 Glide.with 함수를 부르지 않고 mGlideRequestManager 전역 변수를 이용 하는 방법 입니다.
## Adapter
Adpater를 사용할 때에는 자체적으로 Glide.with로써 클래스를 생성하지 말고, 매개변수로 받아서 이용 합니다.
//In Adapter RecyclerAdapter(Context context, List<MediaStoreData> data, RequestManager requestManager) { this.data = data; mRequestManager= requestManager } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { mRequestManager.load(glideurl).into(imageview); }
참고 사이트 : https://github.com/bumptech/glide/issues/803
http://stackoverflow.com/a/32887693/3534559
전 에러 발생 후, 소스를 전부 고쳐야 해서.. 시간이 좀 걸렸네요.
혹시 Glide 적용 시키고자 하시는 분들 참고 하시면 좋을 듯 합니다.
## setTag를 ImageView에 할당 하지 마세요!!
Glide로 Load 하는 ImageView에 setTag를 할당 하면 아래와 같은 에러 문구가 나옵니다.
java.lang.IllegalArgumentException: You must not call setTag() on a view Glide is targeting
우리가 쓸터이니 넌 쓰지마! 이거네요 ㅎ
ImageView말고 따른 View에 setTag를 이용하세요.;
'나의 플랫폼 > 안드로이드' 카테고리의 다른 글
[Android] Android volley master library log disable (0) | 2016.04.14 |
---|---|
[Android] getColor와 getDrawable deprecated (0) | 2016.04.07 |
[Android] pointerindex out of range (1) | 2016.04.04 |
[Android] !!! FAILED BINDER TRANSACTION !!! (2) | 2016.03.28 |
[Android] 안드로이드 키보드 보이기 모드 옵션 (0) | 2016.03.18 |