Отредактируйте массив с несколькими обратными вызовами и подождите, пока они все не закончат - PullRequest
0 голосов
/ 03 июля 2018

Я заменяю свою базу данных 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...