Как я могу создать AsyncTask моего getTotalIncomeAmount (), который является функцией типа Integer в моем классе IncomeDao - PullRequest
1 голос
/ 17 октября 2019

Я хочу получить общую сумму дохода из моей таблицы доходов, в которой есть таблица сумм

 @ColumnInfo(name = "Amount")
    private int amount;

И в моем IncomeDao у меня есть

 @Query("SELECT SUM(amount) from income_table")
    Integer getTotalIncomeAmount();

И в моем IncomeRepository у меня есть

public Integer getTotalIncomeAmount()
    {

        return incomeDao.getTotalIncomeAmount();
    }

В моем IncomeViewModel

public Integer getTotalIncomeAmount()
    {
        return incomeRepository.getTotalIncomeAmount();
    }

И я вызываю это в моей главной теме, как это

totalIncome = incomeViewModel.getTotalIncomeAmount();

Но это выдает мне ошибку, что «Невозможно получить доступбазы данных в главном потоке, поскольку он потенциально может заблокировать пользовательский интерфейс на длительный период времени. '

Я знаю, что эту ошибку можно устранить, создав LiveData<Integer> getTotalIncomeAmount(). Но я не хочу делать это по LiveData, потому что я должен наблюдать это, что не очень хорошо в моем случае.

Я хочу, чтобы кто-то показал мне, как создать AsyncTask этого метода вмой класс IncomeRepository, потому что я знаю, что это единственный способ избавиться от этой ошибки. Я довольно новичок в программировании. Когда я создал другие AsyncTask, как это в моем IncomeRepository

private static class UpdateIncomeAsyncTask extends AsyncTask<Income, Void, Void>
    {
        private IncomeDao incomeDao;
        private UpdateIncomeAsyncTask(IncomeDao incomeDao)
        {
            this.incomeDao = incomeDao;
        }

        @Override
        protected Void doInBackground(Income... incomes)
        {
            incomeDao.update(incomes[0]);
            return null;
        }
    }

, мне просто нужен кто-то, кто бы закончил private static class TotalIncomeAmountAsyncTask extends AsyncTask<Void, Void, Void> для меня. Я очень старался, но смог добиться успеха. Заранее спасибо

1 Ответ

1 голос
/ 17 октября 2019

Попробуйте код ниже,

Вы получите сумму в методе doInBackgroud из базы данных, после получения значения вы получите вызов в методе onPostExecute. Если у вас есть глобальная переменная, вы можете напрямую установить значение в методе doInBackgroud.

private void getTotalIncomeAmount() {
        class TotalIncomeAmountAsyncTask extends AsyncTask<Void, Void, Integer> {

            @Override
            protected Integer doInBackground(Void... voids) {
             
                Integer value = DatabaseClient.getInstance(getApplicationContext()).getAppDatabase()
                        .taskDao()
                        .getTotalIncomeAmount();
                return value;
            }

            @Override
            protected void onPostExecute(Integer value) {
                super.onPostExecute(value);
                //
            }
        }
        TotalIncomeAmountAsyncTask totalIncome = new TotalIncomeAmountAsyncTask();
        totalIncome.execute();
    }
...