我的主要活动中有一个SimpleCursorAdapter和一个List。当数据库中没有项目时,我设置了一个emptyView。但AsyncTask每次为onResume创建一个新列表。所以我在列表加载之前得到一个小秒的emptyView屏幕。现在我需要AsyncTask,因为数据查询必须在单独的线程上运行。但我不喜欢每次都会弹出emptyView。我已经在下面附加了我的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);
}
答案 0 :(得分:0)
如果您使用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);
}
答案 1 :(得分:0)
这个问题似乎是一个线程化的东西,你在那里触发了AsyncTask并且onResume
完成了,那么你在等待AyncTask完成时你的视图是空白的。
我想到的一个解决方法是在Activity生命周期的早期启动AsyncTask(例如onCreate或onStart方法),这可能会在第一次加载时及时获得结果。
然后您可以存储检索到的结果,如果用户只是导航然后返回而没有销毁活动,您可以加载旧列表,然后在使用AsyncTask检索更新的列表后刷新它。 / p>
修改强>
另一个简单的解决方法是在AsyncTask的onPre
和onPostExecute
方法中放置一个进度对话框,这将使UI线程阻塞,直到检索到结果,但是闪烁的进度对话框可能会比空白屏幕更刺耳