【问题标题】:FirebaseAuth listener giving null pointerFirebaseAuth 监听器给出空指针
【发布时间】:2018-02-22 03:41:14
【问题描述】:

我正在为我的应用制作一个启动画面。在加载启动画面时,我想检查用户是否登录

如果用户是登录,那么我想向他展示主要活动,如果未登录,那么我想将他重定向到LoginActivity。

我使用 firebase 作为我的后端,我正在检查 Asynctask 上的用户。 This thing i have seen at here.

我在 onStart() 中添加了 FirebaseAuth 监听器。

我明白为什么它给我错误,但我不明白在哪里添加它以便我的应用程序运行正常。

如果有人可以帮助我或提供一些更好的建议来做同样的事情会有所帮助。
提前谢谢..

MainActivity.java

public class MainActivity extends AppCompatActivity {


    private FirebaseDatabase mDataBase;
    private DatabaseReference mUserDatabase;
    protected FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthStateListener;
    private String mCurrentUser;
    private static int SPLASH_TIME_OUT = 2000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.welcome_screen);

        mDataBase = FirebaseDatabase.getInstance();
        mUserDatabase = mDataBase.getReference("users");
        mUserDatabase.keepSynced(true);
        startProcessing();
    }

    private void startProcessing() {
     new  userCheckOperation().execute();
    }

    protected void userIsLogIn() {
        mAuth = FirebaseAuth.getInstance();
        mAuthStateListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                if (firebaseAuth.getCurrentUser() == null) {
                    Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class);
                    //user won't go back
                    loginIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(loginIntent);
                    finish();
                }
            }
        };

    }

    @Override
    protected void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthStateListener);
    }

    private void checkUserExists() {
        if (mAuth.getCurrentUser() != null) {
            mCurrentUser = mAuth.getCurrentUser().getUid();
            mUserDatabase.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (!dataSnapshot.hasChild(mCurrentUser)) {
                        Intent setupIntent = new Intent(MainActivity.this, SetupActivity.class);
                        //user won't go back
                        setupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(setupIntent);
                        finish();
                    } else {
                        if (mCurrentUser.equals("nKnlkU2fWGeLlP2QDc8CLz21Fet1")) {
                            Intent admin_mainIntent = new Intent(MainActivity.this, AdminMainActivity.class);
                            //user won't go back
                            admin_mainIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                            startActivity(admin_mainIntent);

                            finish();
                        } else {
                            Intent user_mainIntent = new Intent(MainActivity.this, UserMainActivity.class);

                            //user won't go back
                            user_mainIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                            startActivity(user_mainIntent);

                            finish();
                        }

                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    }

    @Override
    public void onStop() {
        super.onStop();
        if (mAuthStateListener != null) {
            mAuth.removeAuthStateListener(mAuthStateListener);
        }
    }

    private class userCheckOperation extends AsyncTask<Void,Void,Void>{
        @Override
        protected Void doInBackground(Void... voids) {
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.interrupted();
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            userIsLogIn();
            checkUserExists();

        }

    }

}

日志

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.lenovo.jdstudio, PID: 17986
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lenovo.jdstudio/com.example.lenovo.jdstudio.MainActivity}: java.lang.NullPointerException
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429)
                      at android.app.ActivityThread.access$800(ActivityThread.java:151)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)
                      at android.os.Handler.dispatchMessage(Handler.java:110)
                      at android.os.Looper.loop(Looper.java:193)
                      at android.app.ActivityThread.main(ActivityThread.java:5333)
                      at java.lang.reflect.Method.invokeNative(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:515)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
                      at dalvik.system.NativeStart.main(Native Method)
                   Caused by: java.lang.NullPointerException
                      at com.example.lenovo.jdstudio.MainActivity.onStart(MainActivity.java:94)
                      at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1174)
                      at android.app.Activity.performStart(Activity.java:5353)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2340)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429) 
                      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342) 
                      at android.os.Handler.dispatchMessage(Handler.java:110) 
                      at android.os.Looper.loop(Looper.java:193) 
                      at android.app.ActivityThread.main(ActivityThread.java:5333) 
                      at java.lang.reflect.Method.invokeNative(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:515) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644) 
                      at dalvik.system.NativeStart.main(Native Method) 

【问题讨论】:

    标签: android android-asynctask firebase-authentication


    【解决方案1】:

    简单用这个,我个人参考这个方法:

        //Get Firebase auth instance
        FirebaseAuth auth = FirebaseAuth.getInstance();
        if (auth.getCurrentUser() != null) {
            // User is logged in - send it to home screen \\
        } else {
            //User is not logged in - send it to login screen \\
        }
    

    您可以将此代码放在 onCreate() 方法中,如果用户已登录,则可以将用户发送到主活动,否则将用户发送到登录屏幕

    对于您的初始屏幕:

    public class SplashScreenActivity extends AppCompatActivity {
    
        private static final int SPLASH_TIME_OUT = 2000;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_splash_screen);
    
            new Handler().postDelayed(new Runnable() {
    
                /*
                 * Showing splash screen with a timer. This will be useful when you
                 * want to show case your app logo / company
                 */
    
                @Override
                public void run() {
                    //Get Firebase auth instance
                    FirebaseAuth auth = FirebaseAuth.getInstance();
                    if (auth.getCurrentUser() != null) {
                        // User is logged in - send it to home screen \\
                    } else {
                        //User is not logged in - send it to login screen \\
                    }
                }
            }, SPLASH_TIME_OUT);
    
        } // End On-Create \\
    
    } // End Class \\
    

    【讨论】:

    • 我只在我的userIsLogIn()使用过这个方法
    • 这是检查用户是否登录的最简单方法。你可以试试
    • 我想在显示启动画面时在 bg 中检查这个我该怎么做
    • 把它放在你的启动画面中,然后在延迟后的方法中放置我的代码
    • 我这样做了,但 mAuth.addAuthStateListener(mAuthStateListener); 给出的是空指针。所以我应该把这条线放在哪里。目前我把它放在onStart()
    猜你喜欢
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多