Комната без LiveData - PullRequest
       5

Комната без LiveData

0 голосов
/ 15 февраля 2019

Я экспериментирую с базой данных Room. Я не хочу, чтобы мои данные наблюдались, я просто хочу получить данные из базы данных один раз .Как добиться этого с помощью MVVM?

Проблема, с которой я столкнулся: Если я пытаюсь получить данные без AsyncTask, это дает: Невозможно получить доступ к базе данных в главном потоке, поскольку потенциально может заблокировать пользовательский интерфейс на длительный периодвремени (как и ожидалось), и если я использую AsyncTask, метод возвращает ноль List, поскольку метод возвращает до завершения AsyncTask.

Класс Dao:

@Query("SELECT * FROM student_table where StudentName = :studentName")List<Student> getStudentWithSameName(String studentName);

Репозиторий:

public List<Student> getAllStudentWithSameName(String studentName) {
    new GetAllStudentWithSameNameAsyncTask(studentDao).execute(studentName);
    return studentsWithSameName;
}



private class GetAllStudentWithSameNameAsyncTask extends AsyncTask< String,Void, List<Student> > {

    StudentDao studentDao;

    public GetAllStudentWithSameNameAsyncTask(StudentDao studentDao) {
        this.studentDao = studentDao;
    }

    @Override
    protected List<Student> doInBackground(String... strings) {
        List<Student> students = studentDao.getStudentWithSameName(strings[0]);
        return students;
    }

    @Override
    protected void onPostExecute(List<Student> students) {
        studentsWithSameName = students;
        super.onPostExecute(students);
    }
}

ViewModel:

public List<Student> getStudentWithSameName(String studentName) {
    studentsWithSameName = studentRepository.getAllStudentWithSameName(studentName);
    return studentsWithSameName;
}

MainActivity:

viewModel = ViewModelProviders.of(this).get(StudentViewModel.class);
List<Student> students = viewModel.getStudentWithSameName("Bill");

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

use: new GetAllStudentWithSameNameAsyncTask(studentDao).execute(studentName).get(); и ваша задача будет ждать результата.Я также предлагаю вернуть список из asyncTask.

0 голосов
/ 15 февраля 2019

Вы можете использовать это как пример :

class WordViewModel(application: Application) : AndroidViewModel(application) {

    private var parentJob = Job()
    private val coroutineContext: CoroutineContext
        get() = parentJob + Dispatchers.Main
    private val scope = CoroutineScope(coroutineContext)

    private val repository: WordRepository
    val allWords: LiveData<List<Word>>

    init {
        val wordsDao = WordRoomDatabase.getDatabase(application).wordDao()
        repository = WordRepository(wordsDao)
        allWords = repository.allWords
    }

    fun insert(word: Word) = scope.launch(Dispatchers.IO) {
        repository.insert(word)
    }

    override fun onCleared() {
        super.onCleared()
        parentJob.cancel()
    }
}

ИМХО: лучше, чем AsyncTask.

Вы можете подписаться на codelabs от Google и узнать, как использовать Kotlin Coroutines.

...