android - 将 Android textview 绑定(bind)到 firebase 数据库字段

标签 android firebase firebase-realtime-database android-asynctask

我的 Activity 中有一个 textView - 比如“用户名”。它应该从 Firebase 数据库中填充。我正在 Asynctask 中进行 Firebase 查询,以免阻止 Activity 。然而,这意味着在 Firebase 查询完全执行之前先加载 TextView。

那么,在 AsyncTask 中执行 Firebase 查询并且用户名已知后,刷新此文本框的最佳方式是什么? 我不想在从数据库中获取数据时显示进度条并阻止 Activity 。这会破坏在 AsyncTask 中执行此操作的目的。

AsyncTask 的代码如下

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

AsyncTask 中我的 Firebase 查询代码如下

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

最佳答案

希望这个例子对你有帮助

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

关于android - 将 Android textview 绑定(bind)到 firebase 数据库字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46610364/

相关文章:

swift - Firebase 推送数据 Swift?

安卓 Dagger 2 : Inject versus Provides

php - 服务器接收到作为二维码扫描器的客户端手机的二维码扫描结果后,如何将查询结果显示在php页面上

Android:GPS 时间戳与 SensorEvent 时间戳

firebase - 使用数据存储导出和导入服务导出 Cloud Firestore 数据?

node.js - 使用 Firebase Cloud Function iOS 推送通知

android - 如何打开抽屉布局移动所有 View 而不只是滑过?

javascript - Angular Firestore : What is the correct syntax for a collection query that uses a where clause?

android - 登录后显示 'Unfortunately, app has stop'

android - Firebase 无法将类型为 java.lang.String 的对象转换为类型