我正在尝试获取登录用户的ID并将其用于两个片段。在我首先使用的片段中,id被检索并正确存储在我的全局变量中,但是当我访问其他片段之后,我的应用程序崩溃说getUid()在另一个活动中生成空指针异常。
这是我的代码(除了不同的变量名之外,两个片段都有相同的代码.LDQApp是我的全局变量类)
public class RecruitmentFragment extends Fragment {
private DatabaseReference mDatabase;
EditText name_text,reg_text,year_txt, mob_txt,interest_txt;
Button button;
public RecruitmentFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_recruitment, container, false);
name_text = (EditText)rootView.findViewById(R.id.editText2);
reg_text = (EditText)rootView.findViewById(R.id.editText3);
year_txt = (EditText)rootView.findViewById(R.id.editText4);
mob_txt = (EditText)rootView.findViewById(R.id.editText5);
interest_txt = (EditText)rootView.findViewById(R.id.editText6);
button = (Button)rootView.findViewById(R.id.button2);
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
mDatabase=FirebaseDatabase.getInstance().getReference("recruitment");
FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
LDQApp.uid = firebaseUser.getUid();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String name,regNo,mobNo,interest;
int year;
name = name_text.getText().toString();
regNo = reg_text.getText().toString();
year = Integer.parseInt(year_txt.getText().toString());
mobNo = mob_txt.getText().toString();
interest = interest_txt.getText().toString();
RecruitUser recruitUser = new RecruitUser(name,regNo,year,mobNo,interest);
mDatabase.child(LDQApp.uid).setValue(recruitUser);
mDatabase.child(LDQApp.uid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
RecruitUser sUser = dataSnapshot.getValue(RecruitUser.class);
Toast.makeText(getContext(),"Submitted successfully",Toast.LENGTH_SHORT).show();
Log.d(TAG, "User name: " + name + ", Registration No: " + regNo);
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
Log.w(TAG, "Failed to read value.", error.toException());
}
});
}
});
return rootView;
}
}
这是请求的日志
答案 0 :(得分:0)
像这样获取FirebaseDatabase
:
你不需要调用它并再次分配新值再次使用静态值;
public class Util {
private static FirebaseDatabase database;
public static FirebaseDatabase getDatabase() {
if (database == null) {
database = FirebaseDatabase.getInstance();
database.setPersistenceEnabled(true);
}
return database;
}
}
然后你可以像Util.getDatabase()
那样访问它,或者你也可以保留一个静态布尔值,就像我在那个评论中说的那样,但这也避免了更多的代码冗余。
答案 1 :(得分:0)
这很简单,只需创建一个扩展Application
的新类public class FireApp extends Application {
@Override
public void onCreate() {
super.onCreate();
/* Enable disk persistence */
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
}
通过添加名称属性
将其连接到清单文件中的项目<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name=".FireApp"
android:supportsRtl="true"
android:theme="@style/AppTheme">
答案 2 :(得分:0)
在使用Firebase身份验证时,请注意,一旦用户登录,用户将始终登录。不要将UID存储在这样的全局中。无论您需要知道用户的登录状态,通常都应使用AuthStateListener来跟踪该状态。您传递的回调将始终使用用户的正确登录状态进行调用,您可以相应地对该信息做出反应。
此外,如果您打算使用getCurrentUser()尝试获取当前登录的用户,请注意,当用户未登录时,它可以返回null。这可能是什么&#39;发生在你身上,为什么调用getUid()会为你抛出一个NPE。