2017-01-04 321 views
0

我想用orderbychild过滤所有帖子。但该应用程序崩溃。当我调试它显示了错误:应用程序崩溃java.lang.NullPointerException

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' 
+0

请发表您的build.gradle(模块:APP) –

+1

也许当前用户为空?您是否登录特定手机的Firebase? – Christopher

+0

应用程序启动良好。但是,当我登录应用程序崩溃。 @Christopher –

回答

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 
} 
+0

创建用户自动签名。 –

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