应用程式因java.lang.NullPointerException而当机 [英] App crashes with java.lang.NullPointerException

查看:61
本文介绍了应用程式因java.lang.NullPointerException而当机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用orderbychild过滤所有帖子.但是该应用程序崩溃了.在我调试之后,它在:

上显示错误

final String currentUserId=mAuth.getCurrentUser().getUid();  this line of code.

//我在一台设备上进行了测试,但运行正常,但在另外两台设备上,应用崩溃了

//这是我的错误报告

java.lang.NullPointerException
                  at com.soumya.uglypeople.MyPosts.onCreateView(MyPosts.java:80)
                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
                  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                  at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1643)
                  at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
                  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
                  at android.support.v4.view.ViewPager.populate(ViewPager.java:1272)
                  at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1646)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:700)
                  at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
                  at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1364)
                  at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:765)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                  at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
                  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
                  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
                  at android.view.Choreographer.doCallbacks(Choreographer.java:562)
                  at android.view.Choreographer.doFrame(Choreographer.java:532)
                  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
                  at android.os.Handler.handleCallback(Handler.java:725)
                  at android.os.Handler.dispatchMessage(Handler.java:92)
                  at android.os.Looper.loop(Looper.java:137)
                  at android.app.ActivityThread.main(ActivityThread.java:5041)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:511)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                  at dalvik.system.NativeStart.main(Native Method)

//这是我的活动代码:

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.facebook.CallbackManager;
import com.facebook.FacebookSdk;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.widget.ShareDialog;
import com.firebase.client.Firebase;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Callback;
import com.squareup.picasso.NetworkPolicy;
import com.squareup.picasso.Picasso;


import static android.R.id.list;
import static com.facebook.FacebookSdk.getApplicationContext;
import static com.squareup.picasso.Picasso.with;


public class MyPosts extends Fragment{


    private RecyclerView postList;
    private DatabaseReference mDatabase;
    private DatabaseReference mDatabaseAppriciate;
    private DatabaseReference mDatabaseDisgrace;
    private LinearLayoutManager layoutManager;
    private FirebaseAuth mAuth;
    private DatabaseReference mDatabaseCurrentUser;
    private Query mQueryCurrentUser;


    //private static final String TAG = "MyActivity";

    private boolean mProcessAppriciate=false;
    private boolean mProcessDisgrace=false;



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        super.onSaveInstanceState(savedInstanceState);
        View rootView = inflater.inflate(R.layout.allposts, container, false);

        mAuth= FirebaseAuth.getInstance();

        mDatabase= FirebaseDatabase.getInstance().getReference().child("Posts");
        mDatabaseAppriciate=FirebaseDatabase.getInstance().getReference().child("Appriciate");
        mDatabaseDisgrace=FirebaseDatabase.getInstance().getReference().child("Disgrace");

        //Below line shows error
        final String currentUserId=mAuth.getCurrentUser().getUid();
        mDatabaseCurrentUser=FirebaseDatabase.getInstance().getReference().child("Posts");
        mQueryCurrentUser=mDatabaseCurrentUser.orderByChild("uid").equalTo(currentUserId);

        mDatabase.keepSynced(true);
        mDatabaseAppriciate.keepSynced(true);
        mDatabaseDisgrace.keepSynced(true);


        postList=(RecyclerView) rootView.findViewById(R.id.postList);
        postList.setHasFixedSize(true);
        layoutManager=new LinearLayoutManager(getActivity());
        layoutManager.setReverseLayout(true);
        postList.setHasFixedSize(true);
        postList.setLayoutManager(layoutManager);


        postList.getRecycledViewPool().clear();   


        return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();


        FirebaseRecyclerAdapter<Posts,PostViewHolder> firebaseRecyclerAdapter= new FirebaseRecyclerAdapter<Posts,PostViewHolder>(

                Posts.class,
                R.layout.single_post,
                PostViewHolder.class,
                mQueryCurrentUser

        ) {

            @Override
            protected void populateViewHolder(final PostViewHolder viewHolder, final Posts model, final int position) {

                final String post_key=getRef(position).getKey();

                viewHolder.setTitle(model.getTitle());
                viewHolder.setDescription(model.getDescription());
                viewHolder.setProfileName(model.getProfilename());
                viewHolder.setImage(getContext(),model.getImage());
                viewHolder.getLayoutPosition();
                viewHolder.setAppriciateButton(post_key);
                viewHolder.setDisgraceButton(post_key);



                //Share click code below
                viewHolder.Share.setOnClickListener(new View.OnClickListener() {

                    CallbackManager callbackManager;
                    ShareDialog shareDialog;
                    @Override
                    public void onClick(View v) {

                        FacebookSdk.sdkInitialize(getApplicationContext());
                        callbackManager = CallbackManager.Factory.create();
                        shareDialog = new ShareDialog(MyPosts.this);
                        if (ShareDialog.canShow(ShareLinkContent.class)) {

                            ShareLinkContent content = new ShareLinkContent.Builder()
                                    .setContentTitle(model.getTitle())
                                    .setContentDescription(model.getDescription())
                                    .setImageUrl(Uri.parse(model.getImage()))
                                    .setContentUrl(Uri.parse("https://developers.facebook.com"))
                                    .build();
                            shareDialog.show(content);

 }

  }

                });

                viewHolder.Appriciate.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mProcessAppriciate=true;



                        mDatabaseAppriciate.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (mProcessAppriciate) {

                                    if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) {
                                        mDatabaseAppriciate.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();

                                        mProcessAppriciate = false;

                                    }else {
                                        mDatabaseAppriciate.child(post_key).child(mAuth.getCurrentUser().getUid()).setValue(mAuth.getCurrentUser().getDisplayName());
                                             viewHolder.Appriciate.setText("APPRICIATED");

                                        mProcessAppriciate = false;


                                    }

                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                    }



                });




                viewHolder.Disgrace.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mProcessDisgrace=true;



                        mDatabaseDisgrace.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (mProcessDisgrace) {

                                    if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) {
                                        mDatabaseDisgrace.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();
//
                                        mProcessDisgrace = false;

                                    } else {
                                        mDatabaseDisgrace.child(post_key).child(mAuth.getCurrentUser().getUid()).setValue(mAuth.getCurrentUser().getDisplayName());
//
                                        mProcessDisgrace = false;


                                    }

                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                    }



                });


                //Disgrace Button Click code Ends

            }

        };

        postList.setAdapter(firebaseRecyclerAdapter);


        //test code
        firebaseRecyclerAdapter.notifyDataSetChanged();

    }


    public static class PostViewHolder extends RecyclerView.ViewHolder{

        View mView;
        Button Appriciate;
        Button Disgrace;
        Button Share;
        DatabaseReference mDatabaseAppriciate;
        DatabaseReference mDatabaseDisgrace;
        FirebaseAuth mAuth;




        public PostViewHolder(View itemView) {
            super(itemView);
            mView=itemView;
            Appriciate=(Button) mView.findViewById(R.id.appriciate);
            Disgrace=(Button) mView.findViewById(R.id.disgraceful);
            Share=(Button) mView.findViewById(R.id.share);


            mDatabaseAppriciate=FirebaseDatabase.getInstance().getReference().child("Appriciate");
            mDatabaseDisgrace=FirebaseDatabase.getInstance().getReference().child("Disgrace");
            mAuth=FirebaseAuth.getInstance();
            mDatabaseAppriciate.keepSynced(true);
            mDatabaseDisgrace.keepSynced(true);


        }

        public void setAppriciateButton(final String post_key){

            mDatabaseAppriciate.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())){
                        Appriciate.setBackgroundColor(Color.GRAY);
                        Appriciate.setText("Appriciated");

                    }else{
                        Appriciate.setBackgroundColor(Color.GREEN);
                        Appriciate.setText("APPRICIATE");
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }


        public void setDisgraceButton(final String post_key){

            mDatabaseDisgrace.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())){
                        Disgrace.setBackgroundColor(Color.GRAY);
                        Disgrace.setText("Disgraced");

                    }else{
                        Disgrace.setBackgroundColor(Color.RED);

                        Disgrace.setText("DISGRACE");
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }

        public void setTitle(String title){
            TextView postTitle=(TextView) mView.findViewById(R.id.allPostTitle);
            postTitle.setText(title);

        }

        public void setDescription(String description){
            TextView postDescription=(TextView) mView.findViewById(R.id.allPostDescription);
            postDescription.setText(description);
        }

        public void setProfileName(String profilename){
            TextView postName=(TextView) mView.findViewById(R.id.profileName);
            postName.setText(profilename);
        }




        public void setImage(final Context context, final String image) {
            final ImageView postImage=(ImageView) mView.findViewById(R.id.allPostImage);
            with(context).load(image).networkPolicy(NetworkPolicy.OFFLINE).into(postImage, new Callback() {
                @Override
                public void onSuccess() {

                }

                @Override
                public void onError() {



                    Picasso.with(context).load(image).resize(500,700).into(postImage);

                }
            });

        }




    }
}

//这里是构建gradle(Module.app)

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE-FIREBASE.txt'
        exclude 'META-INF/NOTICE'

    }


    defaultConfig {


        minSdkVersion 17
        targetSdkVersion 24
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support:design:24.2.1'
    compile 'com.android.support:recyclerview-v7:24.2.1'
    compile 'com.android.support:cardview-v7:24.2.1'
    compile 'com.google.firebase:firebase-core:10.0.1'
    compile 'com.google.firebase:firebase-database:10.0.1'
    compile 'com.google.firebase:firebase-storage:10.0.1'
    compile 'com.google.firebase:firebase-auth:10.0.1'
    compile 'com.firebase:firebase-client-android:2.5.2'
    compile 'com.firebaseui:firebase-ui-database:1.0.1'
    compile 'com.squareup.picasso:picasso:2.5.2'
    testCompile 'junit:junit:4.12'
    compile 'com.google.android.gms:play-services:10.0.1'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.squareup.okhttp3:okhttp:3.5.0'
    compile 'com.facebook.android:facebook-android-sdk:[4,5)'
}
apply plugin: 'com.google.gms.google-services'

解决方案

问题是您正在同步读取当前用户,该用户可能返回null:

final String currentUserId=mAuth.getCurrentUser().getUid()

应用启动时,可能尚不知道用户的登录状态.在这种情况下,getCurrentUser()将返回null,这会使您的代码崩溃.

为防止这种情况,您应该 以确认/更改身份验证状态:

FirebaseAuth.getInstance().addAuthStateListener(new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) {
            // User is signed in
            Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
        }
    }
});

I wanted to filter all the posts with orderbychild. But the app crashes. After I debug it shows error on :

final String currentUserId=mAuth.getCurrentUser().getUid();  this line of code.

// I tested on one device but it works fine but in two other devices the app crashes

//Here's my error report

java.lang.NullPointerException
                  at com.soumya.uglypeople.MyPosts.onCreateView(MyPosts.java:80)
                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
                  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                  at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1643)
                  at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
                  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
                  at android.support.v4.view.ViewPager.populate(ViewPager.java:1272)
                  at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1646)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:700)
                  at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
                  at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1364)
                  at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:765)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                  at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
                  at android.view.View.measure(View.java:15518)
                  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
                  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
                  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
                  at android.view.Choreographer.doCallbacks(Choreographer.java:562)
                  at android.view.Choreographer.doFrame(Choreographer.java:532)
                  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
                  at android.os.Handler.handleCallback(Handler.java:725)
                  at android.os.Handler.dispatchMessage(Handler.java:92)
                  at android.os.Looper.loop(Looper.java:137)
                  at android.app.ActivityThread.main(ActivityThread.java:5041)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:511)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                  at dalvik.system.NativeStart.main(Native Method)

// And here is my activity code:

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.facebook.CallbackManager;
import com.facebook.FacebookSdk;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.widget.ShareDialog;
import com.firebase.client.Firebase;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Callback;
import com.squareup.picasso.NetworkPolicy;
import com.squareup.picasso.Picasso;


import static android.R.id.list;
import static com.facebook.FacebookSdk.getApplicationContext;
import static com.squareup.picasso.Picasso.with;


public class MyPosts extends Fragment{


    private RecyclerView postList;
    private DatabaseReference mDatabase;
    private DatabaseReference mDatabaseAppriciate;
    private DatabaseReference mDatabaseDisgrace;
    private LinearLayoutManager layoutManager;
    private FirebaseAuth mAuth;
    private DatabaseReference mDatabaseCurrentUser;
    private Query mQueryCurrentUser;


    //private static final String TAG = "MyActivity";

    private boolean mProcessAppriciate=false;
    private boolean mProcessDisgrace=false;



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        super.onSaveInstanceState(savedInstanceState);
        View rootView = inflater.inflate(R.layout.allposts, container, false);

        mAuth= FirebaseAuth.getInstance();

        mDatabase= FirebaseDatabase.getInstance().getReference().child("Posts");
        mDatabaseAppriciate=FirebaseDatabase.getInstance().getReference().child("Appriciate");
        mDatabaseDisgrace=FirebaseDatabase.getInstance().getReference().child("Disgrace");

        //Below line shows error
        final String currentUserId=mAuth.getCurrentUser().getUid();
        mDatabaseCurrentUser=FirebaseDatabase.getInstance().getReference().child("Posts");
        mQueryCurrentUser=mDatabaseCurrentUser.orderByChild("uid").equalTo(currentUserId);

        mDatabase.keepSynced(true);
        mDatabaseAppriciate.keepSynced(true);
        mDatabaseDisgrace.keepSynced(true);


        postList=(RecyclerView) rootView.findViewById(R.id.postList);
        postList.setHasFixedSize(true);
        layoutManager=new LinearLayoutManager(getActivity());
        layoutManager.setReverseLayout(true);
        postList.setHasFixedSize(true);
        postList.setLayoutManager(layoutManager);


        postList.getRecycledViewPool().clear();   


        return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();


        FirebaseRecyclerAdapter<Posts,PostViewHolder> firebaseRecyclerAdapter= new FirebaseRecyclerAdapter<Posts,PostViewHolder>(

                Posts.class,
                R.layout.single_post,
                PostViewHolder.class,
                mQueryCurrentUser

        ) {

            @Override
            protected void populateViewHolder(final PostViewHolder viewHolder, final Posts model, final int position) {

                final String post_key=getRef(position).getKey();

                viewHolder.setTitle(model.getTitle());
                viewHolder.setDescription(model.getDescription());
                viewHolder.setProfileName(model.getProfilename());
                viewHolder.setImage(getContext(),model.getImage());
                viewHolder.getLayoutPosition();
                viewHolder.setAppriciateButton(post_key);
                viewHolder.setDisgraceButton(post_key);



                //Share click code below
                viewHolder.Share.setOnClickListener(new View.OnClickListener() {

                    CallbackManager callbackManager;
                    ShareDialog shareDialog;
                    @Override
                    public void onClick(View v) {

                        FacebookSdk.sdkInitialize(getApplicationContext());
                        callbackManager = CallbackManager.Factory.create();
                        shareDialog = new ShareDialog(MyPosts.this);
                        if (ShareDialog.canShow(ShareLinkContent.class)) {

                            ShareLinkContent content = new ShareLinkContent.Builder()
                                    .setContentTitle(model.getTitle())
                                    .setContentDescription(model.getDescription())
                                    .setImageUrl(Uri.parse(model.getImage()))
                                    .setContentUrl(Uri.parse("https://developers.facebook.com"))
                                    .build();
                            shareDialog.show(content);

 }

  }

                });

                viewHolder.Appriciate.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mProcessAppriciate=true;



                        mDatabaseAppriciate.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (mProcessAppriciate) {

                                    if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) {
                                        mDatabaseAppriciate.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();

                                        mProcessAppriciate = false;

                                    }else {
                                        mDatabaseAppriciate.child(post_key).child(mAuth.getCurrentUser().getUid()).setValue(mAuth.getCurrentUser().getDisplayName());
                                             viewHolder.Appriciate.setText("APPRICIATED");

                                        mProcessAppriciate = false;


                                    }

                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                    }



                });




                viewHolder.Disgrace.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mProcessDisgrace=true;



                        mDatabaseDisgrace.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (mProcessDisgrace) {

                                    if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) {
                                        mDatabaseDisgrace.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();
//
                                        mProcessDisgrace = false;

                                    } else {
                                        mDatabaseDisgrace.child(post_key).child(mAuth.getCurrentUser().getUid()).setValue(mAuth.getCurrentUser().getDisplayName());
//
                                        mProcessDisgrace = false;


                                    }

                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                    }



                });


                //Disgrace Button Click code Ends

            }

        };

        postList.setAdapter(firebaseRecyclerAdapter);


        //test code
        firebaseRecyclerAdapter.notifyDataSetChanged();

    }


    public static class PostViewHolder extends RecyclerView.ViewHolder{

        View mView;
        Button Appriciate;
        Button Disgrace;
        Button Share;
        DatabaseReference mDatabaseAppriciate;
        DatabaseReference mDatabaseDisgrace;
        FirebaseAuth mAuth;




        public PostViewHolder(View itemView) {
            super(itemView);
            mView=itemView;
            Appriciate=(Button) mView.findViewById(R.id.appriciate);
            Disgrace=(Button) mView.findViewById(R.id.disgraceful);
            Share=(Button) mView.findViewById(R.id.share);


            mDatabaseAppriciate=FirebaseDatabase.getInstance().getReference().child("Appriciate");
            mDatabaseDisgrace=FirebaseDatabase.getInstance().getReference().child("Disgrace");
            mAuth=FirebaseAuth.getInstance();
            mDatabaseAppriciate.keepSynced(true);
            mDatabaseDisgrace.keepSynced(true);


        }

        public void setAppriciateButton(final String post_key){

            mDatabaseAppriciate.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())){
                        Appriciate.setBackgroundColor(Color.GRAY);
                        Appriciate.setText("Appriciated");

                    }else{
                        Appriciate.setBackgroundColor(Color.GREEN);
                        Appriciate.setText("APPRICIATE");
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }


        public void setDisgraceButton(final String post_key){

            mDatabaseDisgrace.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())){
                        Disgrace.setBackgroundColor(Color.GRAY);
                        Disgrace.setText("Disgraced");

                    }else{
                        Disgrace.setBackgroundColor(Color.RED);

                        Disgrace.setText("DISGRACE");
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }

        public void setTitle(String title){
            TextView postTitle=(TextView) mView.findViewById(R.id.allPostTitle);
            postTitle.setText(title);

        }

        public void setDescription(String description){
            TextView postDescription=(TextView) mView.findViewById(R.id.allPostDescription);
            postDescription.setText(description);
        }

        public void setProfileName(String profilename){
            TextView postName=(TextView) mView.findViewById(R.id.profileName);
            postName.setText(profilename);
        }




        public void setImage(final Context context, final String image) {
            final ImageView postImage=(ImageView) mView.findViewById(R.id.allPostImage);
            with(context).load(image).networkPolicy(NetworkPolicy.OFFLINE).into(postImage, new Callback() {
                @Override
                public void onSuccess() {

                }

                @Override
                public void onError() {



                    Picasso.with(context).load(image).resize(500,700).into(postImage);

                }
            });

        }




    }
}

//Here's build gradle (Module.app)

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE-FIREBASE.txt'
        exclude 'META-INF/NOTICE'

    }


    defaultConfig {


        minSdkVersion 17
        targetSdkVersion 24
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support:design:24.2.1'
    compile 'com.android.support:recyclerview-v7:24.2.1'
    compile 'com.android.support:cardview-v7:24.2.1'
    compile 'com.google.firebase:firebase-core:10.0.1'
    compile 'com.google.firebase:firebase-database:10.0.1'
    compile 'com.google.firebase:firebase-storage:10.0.1'
    compile 'com.google.firebase:firebase-auth:10.0.1'
    compile 'com.firebase:firebase-client-android:2.5.2'
    compile 'com.firebaseui:firebase-ui-database:1.0.1'
    compile 'com.squareup.picasso:picasso:2.5.2'
    testCompile 'junit:junit:4.12'
    compile 'com.google.android.gms:play-services:10.0.1'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.squareup.okhttp3:okhttp:3.5.0'
    compile 'com.facebook.android:facebook-android-sdk:[4,5)'
}
apply plugin: 'com.google.gms.google-services'

解决方案

The problem is that you're synchronously reading the current user, which may return null:

final String currentUserId=mAuth.getCurrentUser().getUid()

When the app starts, the sign-in state of the user may not be known yet. In that case getCurrentUser() will return null, which crashes your code.

To prevent this, you should listen for the authentication state to be confirmed/changed:

FirebaseAuth.getInstance().addAuthStateListener(new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) {
            // User is signed in
            Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
        }
    }
});

这篇关于应用程式因java.lang.NullPointerException而当机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆