본문 바로가기

나의 플랫폼/안드로이드

[Android] Glide Library 사용시 참고 사항

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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를 이용하세요.;