Search code examples
javaandroidmvvmandroid-asynctaskandroid-livedata

How to pass two parameters in AsyncTask?


I am using MVVM structure and my query in Dao looks like:

@Query("SELECT * FROM Sorted WHERE date LIKE :date AND categoryChart = :category")
LiveData<List<Sorted>> getSortedDiagramData(String date, String category);

In Repository I need to execute this method in AsyncTask, but I don't understand how to do it.

What I've tried:

 public LiveData<List<Sorted>> getSortedDiagramData(String date, String category){
    String[] array = new String[2];
    array[0] = date;
    array[1] = category;
    return new GetSortedDiagramDataAsyncTask(sortedDao).execute(array);
}

And then:

 private static class GetSortedDiagramDataAsyncTask extends AsyncTask<String[], Void, LiveData<List<Sorted>>> {
    private SortedDao sortedDao;
    private GetSortedDiagramDataAsyncTask(SortedDao sortedDao){
        this.sortedDao = sortedDao;
    }
    @Override
    protected LiveData<List<Sorted>> doInBackground(String[] ... strings) {
        String date1 = String.valueOf(strings[0]);
        String category1 = String.valueOf(strings[1]);
        LiveData<List<Sorted>> list = sortedDao.getSortedDiagramData(date1, category1);
        return list;
    }
}

But when I pass "array" to execute() there is an error "Incompatible types".

Could you please suggest how I can solve this problem? Thanks for any help.


Solution

  • You can pass it in the constructor:

    private String date, category;
    private SortedDao sortedDao;
    public GetSortedDiagramDataAsyncTask(SortedDao sortedDao, String date, String category) {
        this.date = date;
        this.category = category;
        this.sortedDao = sortedDao;
    }
    
    @Override
    protected LiveData<List<Sorted>> doInBackground(String[]... strings) {
        LiveData<List<Sorted>> list = sortedDao.getSortedDiagramData(date, category);
        return list;
    }
    

    Call it as:

    new GetSortedDiagramDataAsyncTask(sortedDao, "date", "category").execute();