Как сохранить полученные данные из Firebase в строковую переменную в Android? - PullRequest
0 голосов
/ 16 сентября 2018

Hy Developers, Я новичок в разработке для Android, поэтому столкнулся с проблемой сохранения и просмотра данных в моем приложении для Android .

Я знаю, что данные можно получить, только когда вы подключены к Интернету.

Но дело в том, что данные извлекаются, а также отображаются в журнале Android.

Но когда я пытаюсь сохранить его в строковую переменную или в массив для отображения в основном действии, использующем этот список или переменную, не работает.

Я объявляю частную строковую переменную для хранения значения из базы данных firebase перед методом onCreate.

Извините за мой вопрос. Но это проблема, с которой я сталкиваюсь.

Ниже приведен код , который я использую, и несколько скриншотов, чтобы сделать вопрос понятным.

public class MainActivity extends AppCompatActivity {

private static final String TAG = "Firelog" ;

Button ans1, ans2, ans3, ans4;

TextView uscore, question, timer;

private String mAnswer;

private ArrayList<String> fbquestions = new ArrayList<String>();

private String quest;

private int mScore = 0;

Random r = new Random();

private int res = 0;

private int c = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    uscore = (TextView) findViewById(R.id.uscore);
    question = (TextView) findViewById(R.id.question);
    timer = (TextView) findViewById(R.id.timer);

    ans1 = (Button) findViewById(R.id.ans1);
    ans2 = (Button) findViewById(R.id.ans2);
    ans3 = (Button) findViewById(R.id.ans3);
    ans4 = (Button) findViewById(R.id.ans4);

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("mcqs");

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Map <String, String> map = (Map)dataSnapshot.getValue();
            quest = map.get("question");

            fbquestions.add(quest);

            Log.v("E_Value","Question is" + quest);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    question.setText(String.valueOf(fbquestions.get(0)));
  }
}

enter image description here

На картинке выше вы можете видеть, что вопрос успешно получен из firebase и виден в журнале.

enter image description here

Но здесь, когда я пытаюсь отобразить вопрос на главном экране после назначения, отображается пустым.

enter image description here

После добавления кода для добавления значения в arraylist происходит сбой приложения.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Вы не можете просто получить значение fbquestions.get(0) вне метода onDataChange(), потому что этот метод имеет асинхронное поведение. Поэтому вы не можете просто создать свой список fbquestions как глобальную переменную и использовать его значение вне callbakc, потому что он всегда будет empty. По сути, вы пытаетесь использовать значение синхронно из API, который является асинхронным. Это не очень хорошая идея. Вы должны обрабатывать API-интерфейсы асинхронно, как и предполагалось.

Быстрое решение этой проблемы - переместить следующую строку кода:

question.setText(String.valueOf(fbquestions.get(0)));

Внутри обратного вызова сразу после этой строки кода:

Log.v("E_Value","Question is" + quest);

И ваша проблема будет решена. Если вы хотите использовать этот список снаружи, я рекомендую вам посмотреть последнюю часть моего ответа из этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

0 голосов
/ 16 сентября 2018

Передать значение квеста в Textview ..

ArrayList<String> questionArrrayList =new Arraylist<>();
questionArrrayList .clear();

   myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Map <String, String> map = (Map)dataSnapshot.getValue();
            quest = map.get("question");
             question.setText(quest);


                questionArrrayList .add(quest);
                Log.v("E_Value","Question is" + quest);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

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