Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Android textview绑定到firebase数据库字段_Android_Firebase_Firebase Realtime Database_Android Asynctask - Fatal编程技术网

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

将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

我的活动中有一个文本视图,比如“用户名”。它应该从Firebase数据库填充。我正在Asynctask中进行Firebase查询,以便不阻止该活动。但是,这意味着在Firebase查询完全执行之前,首先加载TextView

那么,在AsyncTask内执行Firebase查询并知道用户名后,刷新此文本框的最佳方法是什么? 我不想在从数据库获取数据时显示ProgressBar并阻止活动。这将破坏异步任务中执行此操作的目的

异步任务的代码如下所示

   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。我将其设置为静态,因为我需要将同一函数重新用于另一个活动。因此,我没有再次编写它,而是在一个单独的类中使它保持静态。