0

我有一个问题Glide。这个问题发生在这样:滑翔 - 应用程序崩溃与上下文错误在另一个活动

我去我的个人资料页,然后我点击返回按钮,然后我在火力地堡数据库(现在的应用程序崩溃)插入的对象。这个问题在我的UserProfile活动,但我不知道如何解决这个问题。我读过两篇类似的文章,但我不太明白。 (Glide error after activity was destroyed and restartedGlide 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 –

+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

最有可能当用户已经从导航的活动了你的听众接到电话。当活动被破坏时,您需要删除侦听器。或者至少在设置文本之前检查这些视图是否为空。

相关问题