有效加载大型列表的最佳方法

时间:2016-04-13 20:19:10

标签: android performance

我的问题是:如何加载(只有一次,当用户启动应用程序时)一个大型列表视图。


例如,一个短信应用程序。

应用程序打开后,应用程序将获取手机内存中的所有短信并在ListView中显示。但是,如何在不打扰用户或影响性能的情况下做到这一点?

ASyncTask 在用户仍然盯着顶部时查找所有对话?如果他有超过100000条短信怎么办?我应该将其限制为一个数字,当用户到达某一点时,然后加载其余部分吗?
对于“研究你的消息”功能,我是否需要加载所有短信以便于访问或搜索手机内存便于存放?

最后,我总是想知道着名的聊天应用程序是如何处理的,我真的很好奇是什么解决方案。


谢谢你的帮助,

Ysjanati。




编辑:嗯,我问的问题太多了,我会尝试纠正这个问题。

首先,我尝试了很多东西,比如:

  • 在用户滚动列表时逐位加载消息
  • 实例开头的大负载
  • 甚至制作一个带有大量“加载更多”按钮的逐页模型

关于数据库的事情是,如果我们谈论SMS,手机中已经有一个包含我需要的所有数据的实习数据库。您不希望忘记其他应用可能在未经我的应用许可的情况下操纵此数据库;这意味着我们需要在手机的原生数据库和我的自定义数据库之间不断同步。你有什么建议?

再次感谢您的所有答案。

2 个答案:

答案 0 :(得分:0)

最好的方法是将消息或whaterver项目存储在手机上的本地SQLite数据库中,然后通过ContentProvider将它们加载到列表中,例如,在某些批次中。一次100个。这样,您还可以通过编写SQL查询在它们之间进行搜索,并将列表项更改为查询返回的列表项。

Android有自己的概念,称为Loader。 请参阅有关装载程序here的文档。

要使用加载器,首先必须告诉系统你要初始化加载器,如果你使用的是Activity,通常在onCreate方法中,如下所示:

getLoaderManager().initLoader(0, null, this);

然后系统将调用onCreateLoader回调,您必须在其中指定加载内容的方式。例如。使用电话号码按字母顺序加载所有条件:

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// pick the base URI to use depending on whether we are
// currently loading.
Uri baseUri = Contacts.CONTENT_URI

// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
        + Contacts.HAS_PHONE_NUMBER + "=1) AND ("
        + Contacts.DISPLAY_NAME + " != '' ))";
return new CursorLoader(getActivity(), baseUri,
        CONTACTS_SUMMARY_PROJECTION, select, null,
        Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");

}

当系统运行您的查询,然后将结果放入您的适配器,以便您的列表项更改,显示您的查询结果。

// This is the Adapter being used to display the list's data.
SimpleCursorAdapter mAdapter;

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // Swap the new cursor in.  (The framework will take care of closing
    // the old cursor once we return.)
    mAdapter.swapCursor(data);
}

相同的基本步骤适用于任何其他类型的装载机。您不必使用CursorLoader,您可以提出自己的实现来反映您的特定需求。

答案 1 :(得分:0)

始终在另一个线程中查询数据库。 AsyncTask是一个选项,以及其他选项。如果您认为您的数据集可能太大而无法放入内存中,您可能还需要考虑分页结果并动态调整可用项目的窗口,以便在用户滚动视图时进行调整。