Doucment.getString没有给出输出(Firestore)

时间:2018-11-14 19:06:48

标签: java android firebase google-cloud-firestore

enter image description here

我刚刚编写了一个基本代码,以从Firestore数据库获取多个文档。任务正在成功完成,您可以在Log中看到document.getId()document.getData()的值,但是在此之后,当我使用document.getString()时,它将给出空白的输出。我一直在尝试找到我的错误,但我无法找到,我明天要提交项目。忽略下面给定代码中的所有textview声明:

    private FirebaseFirestore db;
private int month,year;
private Calendar calendar;
private  String email;
private String name,points;
private int i,j;
private String q,p,r;
public String[][] data= new String[10][10];
private TextView rankingTextView,a,b;
public TextView t01,t02,t03,t10,t11,t12,t20,t21,t22,t30,t31,t32,t40,t41,t42,t50,t51,t52,t60,t61,t62,t70,t71,t72,t80,t81,t82,t90,t91,t92;

private static final String TAG = "MyApp";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_leaderboard);
    calendar=Calendar.getInstance();
    t01=(TextView)findViewById(R.id.t00);
    t02=(TextView)findViewById(R.id.t01);
    t03=(TextView)findViewById(R.id.t02);
    t10=(TextView)findViewById(R.id.t10);
    t11=(TextView)findViewById(R.id.t11);
    t12=(TextView)findViewById(R.id.t12);
    t20=(TextView)findViewById(R.id.t20);
    t21=(TextView)findViewById(R.id.t21);
    t22=(TextView)findViewById(R.id.t22);
    t30=(TextView)findViewById(R.id.t30);
    t31=(TextView)findViewById(R.id.t31);
    t32=(TextView)findViewById(R.id.t32);
    t40=(TextView)findViewById(R.id.t40);
    t41=(TextView)findViewById(R.id.t41);
    t42=(TextView)findViewById(R.id.t42);
    t50=(TextView)findViewById(R.id.t50);
    t51=(TextView)findViewById(R.id.t51);
    t52=(TextView)findViewById(R.id.t52);
    t60=(TextView)findViewById(R.id.t60);
    t61=(TextView)findViewById(R.id.t61);
    t62=(TextView)findViewById(R.id.t62);
    t70=(TextView)findViewById(R.id.t70);
    t71=(TextView)findViewById(R.id.t71);
    t72=(TextView)findViewById(R.id.t72);
    t80=(TextView)findViewById(R.id.t80);
    t81=(TextView)findViewById(R.id.t81);
    t82=(TextView)findViewById(R.id.t82);
    db= FirebaseFirestore.getInstance();
    email = getIntent().getStringExtra("email");
    month = calendar.get(Calendar.MONTH);
    month = month + 1;
    year = calendar.get(Calendar.YEAR);
    i=0;
    j=0;
    dothis();
    Toast.makeText(this, "MO", Toast.LENGTH_SHORT).show();
    t01.setText(data[0][0]);
    t02.setText(data[0][1]);
    t11.setText(data[1][0]);
    t12.setText(data[1][1]);
    t21.setText(data[2][0]);
    t22.setText(data[2][1]);
    t31.setText(data[3][0]);
    t32.setText(data[3][1]);
    t41.setText(data[4][0]);
    t42.setText(data[4][1]);
    t51.setText(data[5][0]);
    t52.setText(data[5][1]);
    }
private void dothis()
{i=0;
j=0;

    db.collection("users")
           // .whereGreaterThanOrEqualTo("points" + Integer.toString(month) + Integer.toString(year), "0")
            .orderBy("points" + Integer.toString(month) + Integer.toString(year)).limit(10)
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            if(document.exists()) {
                                Log.d(TAG, document.getId() + " => " + document.getData() + " ");
                                data[i][j] = document.getString("username");
                                data[i][j + 1] = document.getString("points" + Integer.toString(month) + Integer.toString(year));
                                i++;
                                Toast.makeText(Leaderboard.this, "OK", Toast.LENGTH_SHORT).show();
                            }
                        }
                    } else {
                        Log.d(TAG, "Error getting documents: ", task.getException());
                    }
                }
            });

}

}

请不要重复我的问题。在放入之前,我进行了很多搜索。

1 个答案:

答案 0 :(得分:1)

根据您的评论,您说的是何时调用以下代码行:

t01.setText(data[0][0]);

您的t01 TextView上没有设置任何内容,这是正常的行为,因为来自Firebase数据库的数据是异步的。这意味着onComplete()方法在调用后立即返回,并且它返回的Task的回调将在一段时间后调用。

不能保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于此方法会立即返回,因此您尚未尝试在data[0][0]方法之外使用的onComplete()变量的值已从回调中填充。

基本上,您正在尝试从异步的API同步使用值。那不是一个好主意。您应该按预期异步处理API。

此问题的快速解决方案是仅在onComplete()方法内将所有这些文本设置为TextViews。如果您需要将它们设置在外面,我建议您深入了解异步世界,并从 post 中查看anwser的最后一部分,其中我已经解释了如何使用自定义功能打回来。您也可以查看此 video 以获得更好的理解。