1

我的主要活动中有一个 SimpleCursorAdapter 和一个列表。当数据库中没有项目时,我设置了一个 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);

}
4

2 回答 2

0

问题似乎是线程问题,您在其中触发 AsyncTask 并onResume完成,然后在等待 AyncTask 完成时您的视图是空白的。

想到的一个修复方法是在 Activity 生命周期的早期触发 AsyncTask(例如 onCreate 或 onStart 方法),这可能会在第一次加载时及时为您提供结果。

然后,您可以存储检索到的结果,如果用户只是导航离开然后返回而没有破坏 Activity,您可以加载旧列表,然后在使用 AsyncTask 检索更新的列表后刷新它。

编辑onPre另一个简单的解决方法是在 AsyncTask 的和方法中 放置一个进度对话框onPostExecute,这会使 UI 线程阻塞,直到检索到结果,但进度对话框的闪烁可能比空白屏幕更刺耳

于 2013-01-18T09:44:43.457 回答
0

如果您使用 a 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);

}
于 2013-01-18T09:42:03.963 回答