Ошибка Android Glide: вы не можете начать загрузку для уничтоженной активности

я использую glide для просмотра изображений, которые получаются как URL-адрес из базы данных в моей деятельности, и я удаляю изображение в действии, где после удаления будет открыто следующее действие, но в первый раз изображение удаляется без каких-либо ошибок, во второй раз, если открыто и нажмите удалить, я получаю эту ошибку:

java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity

Это мой код для удаления изображения:

alert.setNegativeButton("Delete", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(final DialogInterface dialogInterface, final int i) {
                    try {
                        final Query postRef = ref.child("Pendingevents").orderByChild("Eventtitle").equalTo(Title);


                        postRef.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {

                                for (DataSnapshot child : dataSnapshot.getChildren()) {
                                    child.getRef().removeValue();

                                    Toast.makeText(getApplicationContext(), "Event Deleted", Toast.LENGTH_SHORT).show();

                                    Intent intent=new Intent(getApplicationContext(),PendingEvents.class);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);
                                }


                            }

                            @Override
                            public void onCancelled(DatabaseError firebaseError) {

                            }
                        });

                    }catch (Exception e)
                    {
                        Toast.makeText(ApproveEvents.this, "Unknown      Error,please Try Again", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            AlertDialog build=alert.create();
            build.show();
        }
    });

Логкат:

java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
                                                                              at com.a.a.e.o.b(Unknown Source)
                                                                              at com.a.a.e.o.a(Unknown Source)
                                                                              at com.a.a.f.a(Unknown Source)
                                                                              at bootcamplearning.humanplanet.u.a(Unknown Source)
                                                                              at com.google.android.gms.b.ol.a(Unknown Source)
                                                                              at com.google.android.gms.b.qh.b(Unknown Source)
                                                                              at com.google.android.gms.b.qn.run(Unknown Source)
                                                                              at android.os.Handler.handleCallback(Handler.java:739)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:135)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5294)
                                                                              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:904)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

person Chatrapati Shiva    schedule 30.10.2016    source источник
comment
Покажите свой код как минимально воспроизводимый пример.   -  person OneCricketeer    schedule 30.10.2016
comment
Не могли бы вы также добавить полный logcat с разделом кода для Glide, если вы считаете, что это является причиной ошибки?   -  person OneCricketeer    schedule 30.10.2016
comment
Вы уверены, что не запускаете загрузку изображения с одного действия, которое затем уничтожается (например, вращение устройства) до завершения загрузки?   -  person Alex Mawashi    schedule 30.10.2016


Ответы (2)


Обновить

Подход, описанный внизу поста, лучше не использовать.

Основная идея заключается в том, что Glide заботится о жизненном цикле элемента, в котором он работает. Если Fragment или Activity будут уничтожены, Glide закончит свою работу по обработке изображения. Вот подробное обсуждение проблемы.

Подводя итог, вы должны проверить, жива ли ваша активность, прежде чем вызывать load, возвращаясь из некоторых AsyncTask или других потоков:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && someActivity.isDestroyed()) {
    return;
} else {
    Glide.with(someActivity)
          .load(imageUrl)
          ....;
}

Временное решение, не рекомендуется, так как это приведет к ненужной обработке, если Activity будет уничтожен. Но он прост в использовании и делает свою работу.

В Glide.with(context) попробуйте передать контекст приложения вместо Activity. В этом случае вы не должны зависеть от жизненного цикла Activity.

Например, в действии вы можете использовать это:

 Glide.with(getApplicationContext())
      .load(imageUrl)
      .into(yourImageView);

Или во фрагментарности:

 Glide.with(getActivity().getApplicationContext())
      .load(imageUrl)
      .into(yourImageView);
person Gaket    schedule 07.04.2017
comment
Я думаю, что glide предоставляет разные источники контекста по уважительной причине. Следует проверить, не уничтожена ли активность, прежде чем выполнять задание загрузки. - person Robert; 09.11.2018
comment
Правильно, так и есть в разделе «Обходной путь» - person Gaket; 09.11.2018

Во фрагменте используйте:

if(getActivity !=null) {
  Glide.with(getActivity())
    .load(imageUrl)
    .into(yourImageView);
}
person himanshu shrivastava    schedule 01.07.2021