2016-03-23 11 views
0

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

Это мой код:

int count; 
public int getVotesForEvent(final String event_title) { 
    firebaseRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.child("Votes").exists()) { 
       boolean flag = false; 
       for (DataSnapshot event : dataSnapshot.child("Votes").getChildren()) { 
        String event_title2 = event.getKey(); 
        if (event_title2.equals(event_title)) { 
         flag = true; 
         Toast.makeText(EventInfo.this, ""+Integer.parseInt(event.child("event_votes").getValue().toString()), Toast.LENGTH_SHORT).show(); 
         count = Integer.parseInt(event.child("event_votes").getValue().toString()); 
        } 
       } 
       if (flag != true) { 
        count = 0; 
       } 
      } 
      else { 
       count = 0; 
      } 
     } 
    }); 
    return count; 
} 

Проблема заключается в том, что линии:

count = Integer.parseInt(event.child("event_votes").getValue().toString()); 

Эта линия не осуществление переменной count.

Что я здесь делаю неправильно?

+0

Какова ценность «event_votes»? – user1301428

+0

Попробуйте более подробно описать, что именно вы ожидаете. Ожидаете ли вы, что после вызова 'getVotesForEvent()' значение 'count' будет изменено? Потому что это не будет :) –

+0

Кто-то изнутри firebaseRef будет вызывать 'onDataChange()'. Только если это произойдет, вы увидите чендж в своей переменной. – GVillani82

ответ

1

Метод getVotesForEvent() сам не вызывают код внутри. Таким образом, значение count не изменяется, так как ваш код возвращается с getVotesForEvent().

Методы добавляет ValueEventListener (как следует из названия):) с определенным поведением.

Только после a onDataChange происшествие происходит, код внутри выполнен.

Там нет смысла в возвращении count из getVotesForEvent(), он просто возвращает значение, которое было там в то время вы назвали что метода, а не тогда, когда значение count изменений (иногда в будущем).

Повторить другими словами: при звонке addValueEventListener() вы являетесь , не исполняя содержащему его код. Вы загружаете только код, который будет выполняться позже, всякий раз, когда происходит соответствующее событие.

Подумайте о вашем коде, как это:

int count; 
public int getVotesForEvent(final String event_title) { 
    firebaseRef.addValueEventListener(what-shall-be-done-sometimes-in-the-future-when-onDataChange-event-occurs); 
    return count; 
} 

и здесь вы ясно видите, что значение count не изменяется.

+0

Спасибо за ваше объяснение. Но какие изменения вы рекомендуете мне сделать в моем коде выше? –

+0

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

+0

Да, он попадает в «if()». –

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