0

У меня проблема с Glide. Эта проблема возникает следующим образом:Glide - сбой приложения с ошибкой контекста в другом действии

Я перехожу на страницу своего профиля, затем нажимаю кнопку «Назад», а затем вставляю объект в свою базу данных Firebase (теперь приложение сбой). Проблема в моей работе UserProfile, но я не знаю, как это решить. Я прочитал две аналогичные должности, но я не очень хорошо понимаю. (Glide error after activity was destroyed and restarted и Glide image loading with application context)

Мои logcat это:

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.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:87) 
                      at com.bumptech.glide.Glide.with(Glide.java:629) 
                      at gamingproject.sellmybooks.UserProfile.getUserData(UserProfile.java:114) 
                      at gamingproject.sellmybooks.UserProfile.access$000(UserProfile.java:39) 
                      at gamingproject.sellmybooks.UserProfile$1.onDataChange(UserProfile.java:75) 
                      at com.google.android.gms.internal.zzaie.zza(Unknown Source) 
                      at com.google.android.gms.internal.zzaje.zzcta(Unknown Source) 
                      at com.google.android.gms.internal.zzajh$1.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:5608) 
                      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:1397) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1192) 

класс профиля:

public class UserProfile extends AppCompatActivity { 

Context mContext; 
ImageView userProfileImage; 
TextView name, mail, user_location_textView; 
String tag_login; 
String user_name, user_mail, user_token, user_urlPicture, user_location, user_key; 
String TAG_LOGIN = "TAG_LOGIN"; 
String KEY = "KEY"; 
int REQUEST_IMAGE_CAPTURE; 
DatabaseReference users; 

@TargetApi(Build.VERSION_CODES.KITKAT) 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(layout.activity_user_profile); 
    getSupportActionBar().hide(); 

    mContext = this; 

    userProfileImage = (ImageView) findViewById(R.id.imageProfile); 
    name = (TextView) findViewById(R.id.name); 
    mail = (TextView) findViewById(R.id.mail); 
    user_location_textView = (TextView) findViewById(R.id.user_location); 

    Intent intent = getIntent(); 
    tag_login = intent.getStringExtra(TAG_LOGIN); 
    user_key = intent.getStringExtra(KEY); 

    users = FirebaseDatabase.getInstance().getReference("Users").child("User" + tag_login).child(user_key); 

    users.addValueEventListener(new ValueEventListener() { 
     @RequiresApi(api = Build.VERSION_CODES.KITKAT) 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      getUserData(dataSnapshot); 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 

} 


///Get user's data with the key/// 

@TargetApi(Build.VERSION_CODES.KITKAT) 
@RequiresApi(api = Build.VERSION_CODES.KITKAT) 
private void getUserData(DataSnapshot dataSnapshot){ 
    if (Objects.equals(tag_login, "App")){ 
     UserApp userApp = dataSnapshot.getValue(UserApp.class); 
     user_name = userApp.user_name; 
     user_mail = userApp.user_mail; 
     user_token = userApp.user_token; 
     user_location = userApp.user_location; 
     user_urlPicture = userApp.user_bitmapImage; 
     name.setText(user_name); 
     mail.setText(user_mail); 
     user_location_textView.setText(user_location); 
     if (Objects.equals(user_urlPicture, "NoImage")){ 
      userProfileImage.setImageResource(drawable.noimage); 
      Toast.makeText(mContext, "Click on image to change it", Toast.LENGTH_LONG).show(); 
     } else { 
      Glide.with(mContext).load(user_urlPicture).into(userProfileImage); 
     } 
     userProfileImage.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
        REQUEST_IMAGE_CAPTURE = 1; 
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 
       } 
       return false; 
      } 
     }); 


    } 

} 

Спасибо за помощь

+0

Пожалуйста, внесите код. –

+0

Сообщение пользователя userProfile class –

+0

Я обновил свой вопрос – Carlo

ответ

2

вы должны удалить изменения слушателя значение в процессе Вашей деятельности OnDestroy.

Что-то вроде этого:

// during onCreate(Bundle) 
users.addValueEventListener(listener); 

// then during onDestroy() 
users.removeValueEventListener(listener); 

// outside any method you write the listener 
private ValueEventListener listener = new ValueEventListener() { 
     @RequiresApi(api = Build.VERSION_CODES.KITKAT) 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      getUserData(dataSnapshot); 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    } 
+0

Большое спасибо @Budius – Carlo

1

Скорее всего, ваш слушатель получил вызывается, когда пользователь уже перемещаться от деятельности. Вам нужно удалить слушателя, когда действие будет уничтожено. Или, по крайней мере, проверьте, нет ли этих представлений до установки текстов.