我有一个SimpleCursorAdapter和一个列表在我的主要活动。我已经设置了一个emptyView,当数据库中没有项目时显示。但是AsyncTask每次为onResume创建一个新的列表。所以在列表加载前,我得到了一小段时间的emptyView屏幕。现在我需要AsyncTask作为数据查询必须在单独的线程上运行。但是我不喜欢每次都弹出空视图。我在下面附上了AsyncTask和onResume方法。两者都在编译。我该怎么做呢?
class GetItems extends AsyncTask<Object, Void, Cursor> {
DbHelper dbHelper = new DbHelper (MainActivity.this);
@Override
protected Cursor doInBackground(Object... params) {
dbHelper.open();
return dbHelper.getAllItems();
}
@Override
protected void onPostExecute(Cursor result) {
adapter.changeCursor(result);
dbHelper.close();
}
}
@Override
protected void onResume() {
super.onResume();
new GetItems().execute((Object[]) null);
}
问题似乎是一个线程的事情,在那里你发射的AsyncTask和你的onResume
完成,然后你的视图是空白的,而你正在等待AyncTask完成。
想到的一个修复是在Activity生命周期的早期启动AsyncTask(例如onCreate或onStart方法),这可能会让你在第一次加载时及时得到结果。
你可以存储检索到的结果,如果用户只是导航离开,然后回来没有活动被销毁,你可以加载旧的列表,然后刷新它一旦你检索到更新的一个使用AsyncTask。
编辑另一个简单的修复是在AsyncTask的onPre
和onPostExecute
方法中放置一个进度对话框,这将使UI线程阻塞,直到结果被检索到,但是进度对话框的闪烁可能比空白屏幕
如果使用ListFragment
,则可以在任务启动时调用setListShown(false)
,这将显示一个加载微调器。在任务端,调用setListShown(true)
,然后调用setEmptyText()
,根据任务的结果放置一些错误消息或空消息。
或者简单的开关可见性:
class GetItems extends AsyncTask<Object, Void, Cursor> {
DbHelper dbHelper = new DbHelper (MainActivity.this);
@Override
protected void onPreExecute() {
myListView.setVisibility(View.GONE)
}
@Override
protected Cursor doInBackground(Object... params) {
dbHelper.open();
return dbHelper.getAllItems();
}
@Override
protected void onPostExecute(Cursor result) {
adapter.changeCursor(result);
myListView.setVisibility(View.VISIBLE);
dbHelper.close();
}
}
@Override
protected void onResume() {
super.onResume();
new GetItems().execute((Object[]) null);
}