У меня есть приложение, использующее фрагмент с пейджером View. Я запрашиваю базу данных контактов Android (это должно быть быстро), чтобы получить первичные номера каждого контакта для показа в ListView. Проблема в том, что это, похоже, занимает некоторое время. Я попытался использовать Thread и ASyncTask внутри onCreateView и «обновить» или установить мой адаптер для моего списка контактов. Когда я делаю это я получаю некоторые ошибки:Темы внутри фрагмента
не может создать обработчик внутри потока, который не называется Looper.prepare()
Я попытался с помощью Looper.prepare(), но это было бы все еще сбой.
Так что я положил в обработчике, но есть задержка, когда люди запустить мое приложение
final Runnable setupView = new Runnable() {
@Override
public void run() {
contactos = con.getContactSearch("");
setupContacts();
}
};
где: getContactSearch:
public HashMap<String, ContactInfo> getContactSearch(String _where)
{
contactInfo = new HashMap<String, ContactInfo>();
Cursor cursor = null ;
if(_where.length()==0)
{
cursor = getContacts();
}else
{
cursor = getContactsFilter(_where);
}
try
{
while (cursor.moveToNext()) {
String id = cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts._ID));
if(!contactInfo.containsKey(id))
{
String displayName = cursor.getString(cursor
.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
//obtenemos el telefono principal
//String number = "" ;//getPrimaryNumber(id);
ContactInfo ci = new ContactInfo(displayName,"",id);
contactInfo.put(id,ci);
}
}
getPrimaryNumbers();
}finally
{
cursor.close();
}
return contactInfo;
}
и setupcontacts:
mAdapter = new DialerContactsAdapter(contactos,getActivity());
listaContactos.setAdapter(mAdapter);
listaContactos.setFastScrollEnabled(true);
listaContactos.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
mAdapter.mBusy = false;
mAdapter.notifyDataSetChanged();
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
mAdapter.mBusy = false;
mAdapter.notifyDataSetChanged();
break;
case OnScrollListener.SCROLL_STATE_FLING:
mAdapter.mBusy = true;
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
});
Как я делаю это асинхронно? Мне интересно, если я сделаю только поиск контактов в onCreate(), что произойдет, если его быстрее, чем onCreateView, ListView будет null. Выполнение этого «работает», но есть большое отставание. Как я могу оптимизировать этот процесс?
Используйте 'LoaderManager' для управления этим. Извлечение контактов внутри цикла всегда будет медленным. Если вы показываете какую-то информацию в составе ListView, а другие части строки выбираются быстрее, чем информация о контакте, я бы предложил вам лениво загружать более медленные части. – kishu27