应用程序崩溃与java.lang.NullPointerException

时间:2017-01-04 07:01:46

标签: android firebase firebase-authentication

我想用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'

2 个答案:

答案 0 :(得分:1)

问题是,在创建用户时,在firebase中,它不会登录用户。

首先检查mAuth是否为null,如果不为空,则获取getUid。

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // User is signed in
    // Get User details 

} else {
    // No user is signed in
    // create new signin 
}

答案 1 :(得分:1)

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

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

当应用启动时,可能还不知道用户的登录状态。在这种情况下,getCurrentUser()将返回null,这会导致代码崩溃。

为防止这种情况发生,您应该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());
        }
    }
});