如何创建我的 getTotalIncomeAmount() 的 AsyncTask,它是我的 IncomeDao class 中的 Integer 类型函数

How can I create AsyncTask of my getTotalIncomeAmount() which is an Integer type function in my IncomeDao class

我想从我的收入 table 中获得总收入金额,其中金额为 table

 @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();

但它给我的错误是 'Cannot access database on the main thread since it may potentially lock the UI for a long period of time.'

我知道这个错误可以通过创建 LiveData<Integer> getTotalIncomeAmount() 来消除。 但我不想在 LiveData 之前这样做,因为我必须观察它,这对我来说并不好。

我希望有人向我展示如何在 IncomeRepositoryclass 中创建此方法的 AsyncTask,因为我知道这是消除此错误的唯一方法。 我在编程方面相当新。 正如我在我的 IncomeRepository

中创建的其他 AsyncTask
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> 为了我。我非常努力,但我可以成功。 提前致谢

试试下面的代码,

您将从数据库中的 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();
    }