我打算创建一个应用程序,允许我们在SD卡上获取所有歌曲,然后在服务上将歌曲列表推送到SQLite。接下来,我想在活动和显示进度对话框中获取所有歌曲。 运行时遇到问题:第一次没有显示任何内容(只显示进度对话框)。但是当我再次运行它(第二次)时,它运行良好。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListSongs = new ArrayList<>();
lvSong = (ListView) findViewById(R.id.lv_song);
Intent it = new Intent(this, ScanSongService.class);
startService(it);
mDbHelper = new DBHelper(this);
mListSize = mDbHelper.getDBSize();
Log.d(TAG, "-------- mListSize on activity: " + mListSize);
new ScanSongAsyncTask(this).execute();
}
以上代码示例:
在服务上,我加载了所有歌曲并添加到DB。我记录了,没事
第一次, mListSize 为0
第二次, mListSize 为12(SD卡上的歌曲数量)。
答案 0 :(得分:0)
这是因为您在服务中插入了数据并且服务(在单独的线程上运行)需要时间来完成其工作,但您可以立即获得插入数据的大小(就在您启动服务之后)。 完成插入后,您应该在服务中获得大小。
或者,您可以使用AsyncTask并在其doInBackgroung
方法中执行插入,然后在其onPostExecute
方法中获取大小(或执行所需的任何后处理)。您提到的使用进度条的问题也可以通过使用AsyncTask来解决(只需忽略onPostExecute
方法中的进度条)。
如果您像在此处一样使用服务,请更改用于插入数据的代码,如下所示:
void insertData (){
//your code for inserting data
....
Log.d(TAG, "-------- mListSize on activity: " + mListSize);
new ScanSongAsyncTask(this).execute();
}
即。移动ScanSongAsyncTask
的开头并在数据插入代码后记录Db大小。
如果您需要像更新listView那样更新UI,请使用runOnUIThread
来执行此操作。