Реализация AsyncTask с Realm

Я переношу приложение в Realm, и у меня есть AsyncTask (упрощенный для краткости), который я использовал для поиска по списку объектов и фильтрации его на основе поискового запроса:

private class SearchTask extends AsyncTask<String, Void> {

Realm realm;

@Override
protected List<SearchResults> doInBackground(String... params) {

    String searchString = params[0];
    realm = Realm.getDefaultInstance();
    ArrayList<SearchResults> myFoos = FooHelper.getAllFoo(realm);
    ArrayList<Foo> matches = new ArrayList<>();

    for (Foo aFoo : myFoos){
      if(!aFoo.getProperty().isEmpty()){
        matches.add(aFoo);
      }
    }

    realm.close();
    return matches;
}

@Override
protected void onPostExecute(List<SearchResults> results) {
    super.onPostExecute(results);

    synchronized (SearchActivity.this){
      //use search results
    }
}

}

Проблема в том, что при возврате результатов они не могут быть доступны, так как они были созданы в другом потоке. Единственное решение, которое я могу придумать, — это вернуть массив первичных ключей из асинхронной задачи, а затем повторно запросить их снова.

Должен быть лучший способ в основном делать поиск в области. Есть предложения?

1 ответ

  1. До недавнего времени realm вообще не поддерживал асинхронные запросы.

    Вы будете рады узнать, что это изменилось, но вы не делаете это с помощью асинхронной задачи. Вот документация о том, как это сделать:

    https://realm.io/docs/java/latest/#asynchronous-queries