将Android textview绑定到firebase数据库字段

时间:2017-10-06 16:42:57

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

我的活动中有一个textView - 比如“Username”。它应该从Firebase数据库填充。我在Asynctask中进行Firebase查询,以免阻止活动。但是,这意味着在Firebase查询完全执行之前,TextView首先加载。

那么在AsyncTask中执行Firebase查询并且用户名已知之后,刷新此textBox的最佳方法是什么? 我不想showprogressBar并在从数据库中提取数据时阻止活动。这会破坏在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;
                } 

2 个答案:

答案 0 :(得分:2)

我希望这个例子可以帮助你

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

答案 1 :(得分:0)

如果您正在使用Android工作室点击工具&gt; Firebase&gt;实时数据库并按照说明操作。这将帮助您入门。如果您想要拥有用户,并且只希望某些用户访问某些内容,则可能需要单击工具&gt; firebase&gt;身份验证。弗兰克是正确的,不需要异步任务。