Я заменяю свою базу данных Sqlite онлайн-базой данных (Firestore). Для этого каждый ответ базы данных возвращается ко мне по обратному вызову.
Проблема в том, что у меня есть несколько обращений к базе данных в цикле, который заполнил таблицу, и что таблица недоступна, пока я не объявлю ее в конце, и, следовательно, я не могу ее изменить.
Так что я ищу способ заполнить эту таблицу без полного изменения кода, который уже существует. Я видел ArrayBlockingQueue
, но мне интересно, если более простого решения не существует.
Если возможно, я бы хотел сохранить все переменные внутри функции, но пока не нашел решения для этого.
Я знаю, что для этого примера нам не обязательно нужна таблица, но я хочу сохранить ее, потому что это всего лишь пример;)
До (SQLite)
public int player_in_x_game(int id_player) {
int gamesWherePlayerIsHere = 0;
ArrayList<Games> gamesArray = Database.getGamesArray();
for (Game game: gamesArray)
if(Utils.isPlayerPresentInGame(game.getId(), idPlayer))
gamesWherePlayerIsHere++;
return gamesWherePlayerIsHere;
}
После (с обратными вызовами)
private static int counter= 0;
private static int resultNP = 0;
private static ArrayBlockingQueue<Integer> results;
public static void numberGamesWherePlayerIsPresent(final long idPlayer, final Callbacks.IntCallback callback){
Thread thread = new Thread() {
@Override
public void run() {
games(new Callbacks.ListGameCallback() {
@Override
public void onCallback(ArrayList<Game> gameArrayList) {
counterNumberGamesWherePlayerIsPresent= gameArrayList.size();
results = new ArrayBlockingQueue<>(gameArrayList.size());
for (Game game: gameArrayList){
Utils.isPlayerPresentInGame(game.getId(), idPlayer, new Callbacks.BooleanCallback() {
@Override
public void onCallback(boolean bool) {
if (bool)
results.add(1);
else
results.add(0);
}
});
}
int result;
try {
while (counter > 0) {
result = results.take();
counter--;
resultNP += result;
}
}catch (InterruptedException ie){
ie.fillInStackTrace();
Log.e(TAG,"results.take() failed");
}
callback.onCallback(resultNP);
}
});
}
};
thread.setName("Firestore - numberGamesWherePlayerIsPresent()");
thread.start();
}