web-dev-qa-db-fra.com

Vous ne pouvez pas démarrer une charge pour une activité détruite dans une image relativelayout avec glide

J'utilise relativelayout pour définir une image.Pourquoi je n'avais pas utilisé imageview, cela signifie que, dans relativelayout image, je configure des icônes.

Je ne sais pas quel est le problème exactement dans glide.J'ai posté le stacktrace et le code pertinent ci-dessous:

Logcat:

 FATAL EXCEPTION: main
   Process: com.app.steve, PID: 15928 
 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:102)
   at com.bumptech.glide.Glide.with(Glide.Java:644)
                                                                    at com.app.steve.TabMorePagesDetailActivity$allPageDetails.onPostExecute(TabMorePagesDetailActivity.Java:1050)
     at com.app.steve.TabMorePagesDetailActivity$allPageDetails.onPostExecute(TabMorePagesDetailActivity.Java:885)
    at Android.os.AsyncTask.finish(AsyncTask.Java:632)
    at Android.os.AsyncTask.access$600(AsyncTask.Java:177)
   at Android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.Java:645)
    at Android.os.Handler.dispatchMessage(Handler.Java:102)
    at Android.os.Looper.loop(Looper.Java:135)
    at Android.app.ActivityThread.main(ActivityThread.Java:5221)
   at Java.lang.reflect.Method.invoke(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:372)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:899)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:694)

TabMorePagesDetailActivity.Java:

RelativeLayout rlPageCoverImg;

rlPageCoverImg = (RelativeLayout)findViewById(R.id.rl_club_cover_img);

@Override
        protected void onPostExecute(String response) {
            super.onPostExecute(response);

            dialog.dismiss();
        ............

    String coverIMGurl = cover_avatar_obj.getString("url");

    Log.e("ImgURL", coverIMGurl);

 Glide.with(TabMorePagesDetailActivity.this).load(coverIMGurl).asBitmap().signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
                                        .into(new SimpleTarget<Bitmap>(500, 500) {

    @Override
    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
    Drawable drawable = new BitmapDrawable(getResources(), resource);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                                            rlPageCoverImg.setBackground(drawable);
    }
    }
    });

    }else {

    rlPageCoverImg.setBackgroundResource(R.drawable.bg_golive);

    }



    @Override
 protected void onDestroy()
 {
    super.onDestroy();
    Glide.clear(rlPageCoverImg);

 }

layout.xml:

 <RelativeLayout
            Android:id="@+id/rl_club_cover_img"
            Android:layout_width="match_parent"
            Android:layout_height="200dp"
            Android:background="@drawable/cancel_image" >

  // Inside this relativelayout image, I'm using buttons and icons


 </RelativeLayout>
28
Stephen

Vous pouvez simplement vérifier que le contexte est détruit ou non manuellement.

if (context == null) {
    return
} else if (context !is Application) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        if (context is FragmentActivity) {
            if ((context as FragmentActivity).isDestroyed) {
                return
            }
        } else if (context is Activity) {
            if ((context as Activity).isDestroyed) {
                return
            }
        }
    }
}

Ceci peut aussi être représenté comme une fonction d'extension Kotlin:

/**
 * Return true if this [Context] is available.
 * Availability is defined as the following:
 * + [Context] is not null
 * + [Context] is not destroyed (tested with [FragmentActivity.isDestroyed] or [Activity.isDestroyed])
 */
fun Context?.isAvailable(): Boolean {
    if (this == null) {
        return false
    } else if (this !is Application) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            if (this is FragmentActivity) {
                return !this.isDestroyed
            } else if (this is Activity) {
                return !this.isDestroyed
            }
        }
    }
    return true
}
6
DiRiNoiD

J'ai le même problème avant quelques jours. J'ai résolu ce problème en passant le nom de la mémoire de contexte d'application de la mémoire de contexte en cours actuelle.

Peut-être que cela vous aidera: -

utilise ce code

 Glide.with(getApplicationContext())
           .load(coverIMGurl)
           .asBitmap()
           .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
                                    .into(new SimpleTarget<Bitmap>(500, 500) {....}

Même si vous obtenez ce problème, lisez attentivement cet article " https://github.com/bumptech/glide/issues/1097 "

aperçu de ce problème: il s'agit d'un numéro de la bibliothèque Glide.

6
Peter

Essayez ceci avant de charger votre image avec Glide, dans mon cas, mirefer est un StorageReference, miimagen est un ImageView. J'ai résolu ce problème, avec ça. J'espère que cela pourrait vous aider.

if (!this.isFinishing ()) {
                // Load the image using Glide
                Glide.with(YourActivity.this)
                        .using(new FirebaseImageLoader())
                        .load(mirefer)
                        .into(miimagen);
            }
1
Liliana J

Setup Glide avec un paramètre qui a le cycle de vie correct. Par exemple, utilisez Glide.with(this) au lieu de Glide.with(getContext()) dans une vue personnalisée.

0
Cristan