Doucment.getString не дает вывод (Firestore) - PullRequest
0 голосов
/ 14 ноября 2018

enter image description here

Я только что написал базовый код для получения нескольких документов из базы данных Firestore. Задача становится успешной, и вы можете увидеть значение 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 голосов
/ 15 ноября 2018

Согласно вашему комментарию, вы говорите, что когда вы звоните по следующей строке кода:

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

Ничего не установлено в t01 TextView, и это нормальное поведение, поскольку данные, поступающие из базы данных Firebase, являются асинхронными. Это означает, что метод onComplete() возвращается сразу после его вызова, а обратный вызов из Task, который он возвращает, будет вызван через некоторое время.

Нет никаких гарантий относительно того, сколько времени это займет. Таким образом, получение этих данных может занять от нескольких сотен миллисекунд до нескольких секунд. Поскольку этот метод немедленно возвращает значение, значение вашей переменной data[0][0], которую вы пытаетесь использовать вне метода onComplete(), еще не будет заполнено из обратного вызова.

По сути, вы пытаетесь использовать значение синхронно из API, который является асинхронным. Это не очень хорошая идея. Вы должны обрабатывать API-интерфейсы асинхронно, как и предполагалось.

Быстрое решение этой проблемы - установить все эти тексты для ваших TextViews только внутри метода onComplete(). Если вам нужно установить их снаружи, я рекомендую погрузиться в асинхронные миры и посмотреть последнюю часть моего ответа из этого поста , в котором я объяснил, как это можно сделать с помощью Пользовательский обратный звонок. Вы также можете взглянуть на это видео для лучшего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...