简体   繁体   English

滑行-应用程序因另一个活动中的上下文错误而崩溃

[英]Glide - App crashes with a context error in another activity

I have a problem with Glide . 我对Glide有问题。 This problem happens in this way: 此问题以这种方式发生:

I go to my profile page, then I click back button, then I insert an object in my Firebase database (Now the app crashes). 我转到个人资料页面,然后单击“后退”按钮,然后在Firebase数据库中插入一个对象(现在该应用程序崩溃了)。 The problem is in my UserProfile activity but I don't know how to resolve this. 问题出在我的UserProfile活动中,但我不知道该如何解决。 I have read two similar posts but I don't understand well. 我读过两个类似的帖子,但我不太了解。 ( Glide error after activity was destroyed and restarted and Glide image loading with application context ) 活动被销毁并重新启动之后的滑翔错误,以及使用应用程序上下文加载滑翔图像

My logcat is this: 我的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)

Profile class: 个人资料类别:

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


    }

}

Thank you for the help 感谢您的帮助

you should remove the value change listener during your activity onDestroy. 您应该在活动onDestroy期间删除值更改侦听器。

Something like this: 像这样:

// 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) {
        }
    }

Most likely your listener got called when the user already navigated away from the activity. 当用户已经离开活动时,很可能您的听众被呼叫。 You need to remove the listener when the activity is destroyed. 活动销毁后,您需要删除侦听器。 Or at least check if those views are null before setting texts. 或者至少在设置文本之前检查这些视图是否为空。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM