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

问题描述 投票:0回答:1

我想从具有金额表的收入表中获取总收入金额

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

并且在我的IncomeDao中,我>]

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

并且在我的收入库中]

public Integer getTotalIncomeAmount()
    {

        return incomeDao.getTotalIncomeAmount();
    }

在我的IncomeViewModel中

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

而且我在主线程中这样称呼它

totalIncome = incomeViewModel.getTotalIncomeAmount();

但是它给我一个错误'无法访问主线程上的数据库,因为它可能长时间锁定UI。'

我知道可以通过创建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>为了我。我非常努力,但我可以成功。在此先感谢

我想从我的收入表中获得总收入,该收入表具有Amount表@ColumnInfo(name =“ Amount”)私有int量;在我的IncomeDao中,我已经@Query(“ SELECT SUM(amount)from ...

尝试下面的代码,

您将从数据库中的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();
    }
android android-asynctask android-room
1个回答
0
投票

尝试下面的代码,

© www.soinside.com 2019 - 2024. All rights reserved.