2016-10-30 4 views
1

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

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(); 
     } 
    }); 

LogCat:

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) 
+1

Пожалуйста, покажите свой код как [mcve] –

+0

Не могли бы вы добавить полный LogCat а с разделом кода для Glide, если вы считаете, что это является причиной ошибки? –

+0

Вы уверены, что не загружаете изображение изображения из одного действия, которое затем уничтожается (например, вращение устройства) до завершения загрузки? –

ответ

2

Update

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

Основная идея заключается в том, что Glide обеспокоен жизненным циклом элемента, в котором он работает. Если Fragment или Activity будет уничтожен, Glide завершит свою работу по обработке изображений. Here is a detailed discussion of the issue.

Подводя итог, вы должны проверить, если ваша деятельность жива перед вызовом 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); 

Или в framgent:

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