将Android textview绑定到firebase数据库字段
我的活动中有一个文本视图,比如“用户名”。它应该从Firebase数据库填充。我正在Asynctask中进行Firebase查询,以便不阻止该活动。但是,这意味着在Firebase查询完全执行之前,首先加载TextView 那么,在AsyncTask内执行Firebase查询并知道用户名后,刷新此文本框的最佳方法是什么? 我不想在从数据库获取数据时显示ProgressBar并阻止活动。这将破坏异步任务中执行此操作的目的 异步任务的代码如下所示将Android textview绑定到firebase数据库字段,android,firebase,firebase-realtime-database,android-asynctask,Android,Firebase,Firebase Realtime Database,Android Asynctask,我的活动中有一个文本视图,比如“用户名”。它应该从Firebase数据库填充。我正在Asynctask中进行Firebase查询,以便不阻止该活动。但是,这意味着在Firebase查询完全执行之前,首先加载TextView 那么,在AsyncTask内执行Firebase查询并知道用户名后,刷新此文本框的最佳方法是什么? 我不想在从数据库获取数据时显示ProgressBar并阻止活动。这将破坏异步任务中执行此操作的目的 异步任务的代码如下所示 private class CheckUser
private class CheckUserLoginAndRetrieveDataFromFirebase extends AsyncTask <Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
if (thisAppUser!=null) {
setUserDataForToday();
if (createNewNode) { //This is the first time the User is logging in
createUsersNodesForFirstTime();
}
}
return null;
}
public static void setUserDataForToday() {
setProperDatabaseReference(); //This sets reference to user specific nodes in the database
myRef.child("dashboard").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Dashboard dashboard = dataSnapshot.getValue(Dashboard.class);
if (dataSnapshot.getChildrenCount() > 0) {
createNewNode = false;
if (dashboard.checkIfTodaysDateExistsInDatabase()) {
//An entry for todays date exists in database, so no data change needed
myDashboard = dashboard;
}
如果您正在使用Android studio,请单击工具>Firebase>实时数据库并按照说明操作。这会让你开始。如果希望有用户,并且只希望某些用户访问某些内容,则可能需要单击工具>firebase>身份验证为数据库配置规则。Frank是正确的,不需要异步任务。我希望这个例子能帮助您
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setUserDataForToday();
Log.d("MainActivity", "Process is not blocked");
}
public void setUserDataForToday() {
Log.d("MainActivity", "Called method");
DatabaseReference database = FirebaseDatabase.getInstance().getReference();
database.child("users").child("1").child("name").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
String userName = dataSnapshot.getValue(String.class);
Log.d("MainActivity", "Received value: " + dataSnapshot.getValue());
dataSnapshot.getKey();
TextView textView = (TextView) findViewById(R.id.textUserName);
textView.setText(userName);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("MainActivity", "DB error: " + databaseError.getMessage());
}
});
}
public void onClick(View v) {
setUserDataForToday();
}
}
Firebase数据库客户端已经在主线程之外运行所有网络交互,不需要为此使用
AsyncTask
。然后,它在主线程上调用你的onDataChange
,这样你就可以更新UI了。@FrankvanPuffelen-你好,Frank,是的,我之前理解并尝试过,但我一直遇到静态和非静态变量和方法的问题。此外,活动的“上下文”在“onDataChange”中不可用。我不想阻止用户离开正在检索“username”的活动,所以我不想保留上下文或UI元素。但如果“onDataChange”完成后,他仍在进行该活动,我想刷新相应的UI元素。您认为最有效的方法是什么?这不起作用,因为调用onPostExecute的速度比从Firebase检索数据的速度快得多。您是对的。Firebase客户端在单独的线程中加载数据。所以AsyncTask不会等待它。您将setUserDataForToday()设置为静态的原因是什么?不能从静态方法调用非静态属性,所以不能更改UI。如果将setUserDataForToday()设置为非静态,则可以从主线程调用它,并在onDataChange(DataSnapshot DataSnapshot)方法中更改TextView。我将其设置为静态,因为我需要将同一函数重新用于另一个活动。因此,我没有再次编写它,而是在一个单独的类中使它保持静态。