2016-06-16 4 views
0

Я использую Android Studio для создания приложения и моделирования базы данных с использованием Firebase. В настоящее время я пытаюсь включить приложение для ввода и отображения данных, которые я вводил через Firebase. Хотя я использую метод моментальных снимков данных Firebase для сбора данных, я не могу сохранять и использовать данные из-за того, что моментальный снимок происходит во внутреннем классе.Изменение значения переменной внутри внутреннего класса

Например, в Firebase я присвоил значение «Fri» «2 шага». Если вы посмотрите на приведенный ниже код, первый оператор печати (внутри внутреннего класса) печатает «Пятничные шаги: 2 шага», но второй оператор печати (вне внутреннего класса) печатает «Пятнадцать шагов: null». Это проблема, потому что я должен иметь возможность использовать правильное значение fridaySteps (а также переменные String других будних дней), в последующих операторах присваивания, которые присваивают значения mDataset.

public class MainActivity extends AppCompatActivity { 

    private String[] mDataset = new String[7]; 
    String fridaySteps; 
    String thursdaySteps; 
    String wednesdaySteps; 
    String tuesdaySteps; 
    String mondaySteps; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     mDataset[0]= ""; 
     mDataset[1]= ""; 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Firebase.setAndroidContext(this); 

     Firebase ref = new Firebase(Config.FIREBASE_URL); 

     ref.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot snapshot) { 

       fridaySteps = snapshot.child("Fri").getValue(String.class); 
       thursdaySteps = snapshot.child("Thu").getValue(String.class); 
       wednesdaySteps = snapshot.child("Wed").getValue(String.class); 
       tuesdaySteps = snapshot.child("Tue").getValue(String.class); 
       mondaySteps = snapshot.child("Mon").getValue(String.class); 

       System.out.println("Friday Steps: "+fridaySteps); 

      } 
      @Override public void onCancelled(FirebaseError error) { } 
     }); 

     System.out.println("Friday Steps: "+fridaySteps); 

     mDataset[2] = ("Fri  "+fridaySteps); 
     mDataset[3] = ("Thu  "+thursdaySteps); 
     mDataset[4] = ("Wed  "+wednesdaySteps); 
     mDataset[5] = ("Tue  "+tuesdaySteps); 
     mDataset[6] = ("Mon  "+mondaySteps); 

    } 
} 

У кого-нибудь есть советы, как я могу исправить эту проблему? Благодаря!

+0

Можете ли вы присвоить значения 'mDataset' внутри' onDataChange'? У вас их нет, потому что извлечение данных из Firebase происходит асинхронно –

ответ

1

Поскольку получение данных Firebase является асинхронным, вы не сможете получить к нему доступ сразу.

Назначьте свои значения mDataset внутри onDataChange для использования позже. Как это:

ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 

     fridaySteps = snapshot.child("Fri").getValue(String.class); 
     thursdaySteps = snapshot.child("Thu").getValue(String.class); 
     wednesdaySteps = snapshot.child("Wed").getValue(String.class); 
     tuesdaySteps = snapshot.child("Tue").getValue(String.class); 
     mondaySteps = snapshot.child("Mon").getValue(String.class); 

     mDataset[2] = ("Fri  "+fridaySteps); 
     mDataset[3] = ("Thu  "+thursdaySteps); 
     mDataset[4] = ("Wed  "+wednesdaySteps); 
     mDataset[5] = ("Tue  "+tuesdaySteps); 
     mDataset[6] = ("Mon  "+mondaySteps); 

     printData(); 

    } 
    @Override public void onCancelled(FirebaseError error) { } 
}); 

... 

private void printData() { 
    System.out.println("Friday Steps: "+fridaySteps); 
} 
0

Это возникает из-за addValueEventListener является асинхронным, когда addValueEventListener выполняется, следующий шаг будет printh второй System.out.println («Шаги пятницы:» + fridaySteps), по этой причине она возвращая null, он не ждет завершения добавления addValueEventListener. С другой стороны, первый System.out.println («Пятничные шаги:» + fridaySteps) будет ждать завершения добавления addValueEventListener, затем он распечатает сообщение.

Смежные вопросы