Android Studio 之 ROM, LiveData+ViewModel+AsyncTask+Repository

敢说敢作敢为, 无怨无恨无悔。这篇文章主要讲述Android Studio 之 ROM, LiveData+ViewModel+AsyncTask+Repository相关的知识,希望能为你提供帮助。
改造上一节 ROM【1】,
【Android Studio 之 ROM, LiveData+ViewModel+AsyncTask+Repository】1.利用 LiveData< List< Word> >   与 observe  中的 onChanged  配合,删除掉之前的textView更新函数(updateTextView)
  引入 LiveData  与 observe ,只要数据发生改变,就会自动更新内容。
  MainActity类中的代码:
   

LiveData< List< Word> > allWordsLive; allWordsLive = wordDao.getAllWordLive(); //利用 LiveData< > 与 observe的onChanged配合,数据自动刷新 allWordsLive.observe(this, new Observer< List< Word> > () { @Override public void onChanged(List< Word> words) { //当数据改变时会自动呼叫这个函数 //String text=""; StringBuilder text = new StringBuilder(); textView.setText(text); //先将 textView 清空 for(int i=0; i< words.size(); i++){ Word word = words.get(i); text.append(word.getId() + ":" + word.getWord() + "=" + word.getChineseMeaning() + " "); textView.setText(text); } } });


  WordDao类  中将数据返回类型改成 LiveData< List< Word> >   类型
@Query("SELECT * FROM WORD ORDER BY ID DESC") LiveData< List< Word> > getAllWordLive();


2.引入  AsyncTask,用子线程更新数据
wordDatabase = Room.databaseBuilder(this,WordDatabase.class,"word_database") //.allowMainThreadQueries() //allowMainThreadQueries() 强制允许在主线程运行 .build();

 
注释掉 allowMainThreadQueries()
在 MainActivity  中  添加内部类
//内部类,AsyncTask 类型的类 如果以内部类形式出现,必须用 static,否则告警,说内存泄漏 static class InsertAsyncTask extends AsyncTask< Word,Void,Void> { private WordDao wordDao; public InsertAsyncTask(WordDao wordDao) { this.wordDao = wordDao; }@Override protected Void doInBackground(Word... words) { //在工作线程在后台做什么操作 wordDao.insertWords(words); return null; }/*@Override protected void onPostExecute(Void aVoid) { //任务完成时会呼叫,将结果带回给主线程 super.onPostExecute(aVoid); }@Override protected void onProgressUpdate(Void... values) { //当进度发生更新时,会呼叫 super.onProgressUpdate(values); }@Override protected void onPreExecute() { //在后台任务执行之前会呼叫 super.onPreExecute(); }*/ }//内部类,AsyncTask 类型的类 如果以内部类形式出现,必须用 static,否则告警,说内存泄漏 static class UpdateAsyncTask extends AsyncTask< Word,Void,Void> { private WordDao wordDao; public UpdateAsyncTask(WordDao wordDao) { this.wordDao = wordDao; }@Override protected Void doInBackground(Word... words) { //在工作线程在后台做什么操作 wordDao.updateWords(words); return null; } }//内部类,AsyncTask 类型的类 如果以内部类形式出现,必须用 static,否则告警,说内存泄漏 static class DeleteAsyncTask extends AsyncTask< Word,Void,Void> { private WordDao wordDao; public DeleteAsyncTask(WordDao wordDao) { this.wordDao = wordDao; }@Override protected Void doInBackground(Word... words) { //在工作线程在后台做什么操作 wordDao.deleteWords(words); return null; } }//内部类,AsyncTask 类型的类 如果以内部类形式出现,必须用 static,否则告警,说内存泄漏 static class DeleteAllAsyncTask extends AsyncTask< Void,Void,Void> { private WordDao wordDao; public DeleteAllAsyncTask(WordDao wordDao) { this.wordDao = wordDao; }@Override protected Void doInBackground(Void... Voids) { //在工作线程在后台做什么操作 wordDao.deleteAllWords(); return null; } }


原来的4个操作方法中,注释掉主线程操作,改成由子线程操作数据
buttonInsert.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Word word1 = new Word("Hello","你好"); Word word2 = new Word("World","世界"); //wordDao.insertWords(word1,word2); //这里是主线程直接插入数据new InsertAsyncTask(wordDao).execute(word1,word2); //改成子线程对父线程插入数据 //updateView(); } }); buttonUpdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Word word = new Word("English","英语"); word.setId(46); //更新是用主键来更新的 //wordDao.updateWords(word); //主线程操作 new UpdateAsyncTask(wordDao).execute(word); //子线程操作//updateView(); } }); //删除所有的记录 buttonClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //wordDao.deleteAllWords(); //主线程操作 new DeleteAllAsyncTask(wordDao).execute(); //由子线程来操作 //updateView(); } }); buttonDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Word word = new Word("English","英语"); word.setId(46); //删除也是用主键来更新的 //wordDao.deleteWords(word); 主线程操作 new DeleteAsyncTask(wordDao).execute(word); //子线程操作 //updateView(); } });


 

    推荐阅读