Что новичку будет проще использовать вместо устаревшего AsyncTask в данном случае?
Пытаюсь понять какой самый быстрый и простой способ заменить AsyncTask вот в таком приложении.
Код из NoteDao.java:
@Dao
public interface NoteDao {
@Insert
void insert(Note note);
@Update
void update(Note note);
@Delete
void delete(Note note);
};
В "public class Noterepository" содержится следующий код с AsyncTask (для примера, insert):
public void insert(Note note) {
new InsertNoteAsyncTask(noteDao).execute(note);
}
private static class InsertNoteAsyncTask extends AsyncTask<Note, Void, Void> {
private NoteDao noteDao;
private InsertNoteAsyncTask(NoteDao noteDao) {
this.noteDao = noteDao;
}
@Override
protected Void doInBackground(Note... notes) {
noteDao.insert(notes[0]);
return null;
}
};
Также в классе NoteDatabase.java тестовое заполнение таблице делается тоже с помощью AsyncTask:
private static class PopulateDbAsyncTask extends AsyncTask<Void, Void, Void> {
private NoteDao noteDao;
private PopulateDbAsyncTask(NoteDatabase db) {
noteDao = db.noteDao();
}
@Override
protected Void doInBackground(Void... voids) {
noteDao.insert(new Note("Title 1", "Description 1", 1));
noteDao.insert(new Note("Title 2", "Description 2", 2));
noteDao.insert(new Note("Title 3", "Description 3", 3));
return null;
}
};
Чем в этих двух случаях можно заменить AsyncTask? Желательно какой-то не самый сложный вариант, т.к. я новичек. Спасибо.
Ответы (2 шт):
Учите Kotlin и используйте Kotlin Coroutines. Без Kotlin-а в Android сейчас никак. А Корутины простой и эффективный инструмент для асинхронной работы.
Использовать Java методы (Thread, Executors) нет особого смысла. У вас будет куча проблем, связанных с ЖЦ сущностей в Android.
Если же вы не хотите в данный момент учить Kotlin, то вам остается (хотя лучше это знать в любом случае) только Handler или RxJava.
Handler - это решение андроида, не очень удобен в использовании, но в целом просто в изучении.
RxJava - библиотека, которая уже можно сказать является частью языка. Очень удобна и имеет много возможностей, но имеет довольно высокий порог вхождения.
Если в лом использовать Kotlin, посоветую Needle. Можно использовать классический вариант, можно вариант адаптированный мной под переписывание AsyncTask:
Needle.onBackgroundThread().execute(new Preparable() {
@Override
public void prepareOnUi() {
//do smth to prepare UI, e.g. show progressbar
}
@Override
public void run() {
// e.g. do background job
}
});