【发布时间】: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