如何创建我的 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
之前这样做,因为我必须观察它,这对我来说并不好。
我希望有人向我展示如何在 IncomeRepository
class 中创建此方法的 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();
}
我想从我的收入 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
之前这样做,因为我必须观察它,这对我来说并不好。
我希望有人向我展示如何在 IncomeRepository
class 中创建此方法的 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();
}