[英]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。如何解决这个问题?
这是我的onCreateView
, onRequestPermissionsResult
和onActivityResult
部分代码
@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.