2016-04-13 5 views
-3

Мой вопрос: как можно загрузить (только один раз, когда пользователь запускает приложение) большой список.Лучший способ эффективной загрузки больших списков


Например, приложение для SMS.

Как только приложение будет открыто, приложение выберет для всех SMS в памяти телефона и покажет их в ListView. Но как вы можете это сделать, не нарушая пользователя или не влияя на производительность?

AsyncTask ищет все разговоры в то время как пользователь все еще смотрит на вершине? Что делать, если у него более 100 000 SMS? Должен ли я ограничивать его числом и когда пользователь достигает определенной точки, загрузите остальные?
Для функции «исследования в ваших сообщениях» мне нужно, чтобы ВСЕ СМС загружалось для легкого доступа или поиска в памяти телефона для удобства хранения?

Наконец-то я всегда задавался вопросом, как знаменитые чат-приложения справились с этим, и мне действительно интересно, какие решения.


Спасибо за вашу помощь,

Ysjanati.




EDIT: Ну, это правда, что я задавал слишком много вопросов не так много, я буду пытаться исправить это.

Во-первых, я попробовал много вещей, как:

  • загрузки сообщений по кусочкам, пока пользователь прокручивает по списку
  • большая нагрузка в начале экземпляра
  • даже сделав page- по-страничной модели с большой кнопкой «нагрузка больше»

Дело в том, что, если мы говорим о СМС, в телефоне уже есть межсетевая база данных, содержащая все необходимые мне данные. Вы не хотите забывать, что другие приложения могут манипулировать этой БД без разрешения моего приложения; это означает, что нам нужна постоянная синхронизация между родным БД телефона и моим обычным. Что вы предлагаете?

Еще раз спасибо за все ваши ответы.

+0

Вам нужно разбить свой вопрос на управляемые части. Попробуйте подумать с точки зрения читателя, у которого, скорее всего, есть что-то лучше, чем на вопросы StackOverflow. Положите несколько вопросов, которые не имеют четкого окончательного ответа, только чтобы напомнить человеку (мне) о том, что я должен делать! Лучший способ получить ответы - показать, что вы пробовали, и где он специально поступил неправильно. –

+1

use '[Simple] CursorAdapter' +' Loaders' framework + 'SMS ContentProvider' combo – pskink

+0

Да, это то, что я предлагаю реализовать в своем ответе. После этого вы можете реализовать «пейджинг», например, загружать только 50-100 смс за раз и загружать больше только тогда, когда пользователь прокручивается до самого низа или приближается к нему. Использование Loader делает автоматическую перезагрузку при изменении отображаемых данных. –

ответ

0

Лучше всего хранить сообщения или данные о whaterver в локальной базе данных SQLite на телефоне, а затем загружать их в список через ContentProvider определенными партиями, например. 100 за раз. Таким образом, вы также можете искать между ними, записывая SQL-запросы и изменять элементы списка на те, которые были возвращены запросом.

У Android есть своя концепция вокруг него под названием Loader. См. Документацию о погрузчиках here.

Чтобы использовать загрузчик вы сначала сообщить системе, что вы муравей инициализировать загрузчик, как правило, в вашем OnCreate метод, если вы используете активность, как это:

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

Тогда система будет вызывать обратный вызов onCreateLoader, в котором вы должны указать, как вы хотите загрузить контент. Например. загрузить все conacts с номером телефона в алфавитном порядке:

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, вы можете придумать свои собственные реализации, чтобы отразить ваши конкретные потребности.

0

Всегда запрашивайте базы данных в другом потоке. AsyncTask - это опция, среди других опций. Если вы считаете, что ваш набор данных может быть слишком большим, чтобы вписаться в память, вы также можете рассмотреть подкачку результатов и динамическую настройку окна доступных элементов для настройки, когда пользователь прокручивает представление.

+0

Класс списка RecyclerView динамически загружает элементы списка при прокрутке, используя этот класс, объединенный, возможно, с рабочими потоками. Если список очень большой, и вам нужно выполнить код по завершении, вы можете использовать класс android.os.Handler – user2288580

Смежные вопросы