繁体   English   中英

将片段中的Glide与FirebaseDatabase和存储一起使用会导致Glide.with(getActivity)Null对象

[英]Using Glide in Fragment with FirebaseDatabase and Storage resulting to Glide.with(getActivity) Null Object

我正在创建一个应用程序,该应用程序将允许用户通过按ImageView更改其图像,该图像将来自其画廊,并将其上传到我的FirebaseStorage 用户的个人详细信息将分别上传到FirebaseDatabase ,之后将添加ImageUrl。 我收到错误java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.app.Activity.isDestroyed()' on a null object reference 在我从图库中选择Image并继续上传图像之后java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.app.Activity.isDestroyed()' on a null object reference即使出现错误,图像仍会上传到我的FirebaseStorage ,并且ImageUrl将在用户的“详细信息”中更新。 然后重新启动该应用程序实际上会显示我刚刚上传的图片。 该错误在Glide.with(getActivity())部分指出。 我的FirebaseDatabase.addValueEventListener有Glide.with。如何解决这个问题?

这是我的onCreateViewonRequestPermissionsResultonActivityResult部分代码

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    FrameLayout rootView = (FrameLayout)inflater.inflate(R.layout.fragment_tch_profile, container, false);

    mDataRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
             {
                tv_email.setText(dataSnapshot.child("email").getValue(String.class));
                tv_name.setText(dataSnapshot.child("name").getValue(String.class));
                tv_gs.setText(dataSnapshot.child("cassSection").getValue(String.class));
                if(dataSnapshot.hasChild("tImage")){
                    Glide.with(getActivity())
                            .load(dataSnapshot.child("tImage").getValue(String.class))
                            .crossFade()
                            .placeholder(R.mipmap.ic_loader)
                            .thumbnail(0.1f)
                            .diskCacheStrategy(DiskCacheStrategy.ALL)
                            .into(iv_image);
                }

            }
            else {
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(getActivity(),"The read failed: " + databaseError.getCode(),Toast.LENGTH_SHORT).show();
        }
    });

    return rootView;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {
        case READ_EXTERNAL_STORAGE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                callGallery();
            return;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == GALLERY_INTENT && resultCode == RESULT_OK) {

        mImageURI = data.getData();
        iv_image.setImageURI(mImageURI);
        StorageReference filePath = mStorageRef.child("userImage").child(mImageURI.getLastPathSegment());

        filePath.putFile(mImageURI).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                Uri downloadUri = taskSnapshot.getDownloadUrl();  //Ignore This error

                mDataRef.child("tImage").setValue(downloadUri.toString());

            }
        });
    }
}

private void callGallery() {
    Intent i = new Intent(Intent.ACTION_PICK);
    i.setType("image/*");
    startActivityForResult(i, GALLERY_INTENT);
}

这是Logcat:

FATAL EXCEPTION: main
                                                                         Process: kayaba.akihiro.educ_games, PID: 4502
                                                                         java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.app.Activity.isDestroyed()' on a null object reference
                                                                             at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:133)
                                                                             at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:102)
                                                                             at com.bumptech.glide.Glide.with(Glide.java:653)
                                                                             at kayaba.akihiro.educ_games.TchProfile$3.onSuccess(TchProfile.java:169)
                                                                             at kayaba.akihiro.educ_games.TchProfile$3.onSuccess(TchProfile.java:161)
                                                                             at com.google.firebase.storage.zzi.zzi(Unknown Source)
                                                                             at com.google.firebase.storage.zzz.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:148)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

根据@ADM注释,我尝试在分离片段时删除ValueEventListener并确实解决了问题。

以下是添加的代码,以供将来参考:

ValueEventListener mListener;
DatabaseReference mDataRef;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    FrameLayout rootView = (FrameLayout)inflater.inflate(R.layout.fragment_tch_profile, container, false);

    mListener = mDataRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
             {
             //SOME CODES HERE
             }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(getActivity(),"The read failed: " + databaseError.getCode(),Toast.LENGTH_SHORT).show();
        }
    });

    return rootView;
}


    @Override
    public void onDetach() {
        super.onDetach();
        if(mDataRef!=null && mListener!=null){
            mDataRef.removeEventListener(mListener);
        }
    }

暂无
暂无

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

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