Я собираю данные из calllog, помещая их в базу данных и запрашивая их в ListView. С 500 вызовами требуется около 8 секунд, что выглядит плохо, поэтому я решил реализовать progressdialog, чтобы показать пользователю, сколько элементов осталось загрузить. Теперь я пытаюсь использовать 3 элемента (есть 3 элемента в calllog эмулятора). Когда progressdialog заканчивается, listview заполняется тремя элементами, но затем те же 3 элемента добавляются снова и снова, делая бесконечный цикл.
Я опустошаю таблицу перед ее заполнением, поэтому у нее всегда три записи.
В чем проблема?
pd = new ProgressDialog(Calllogs.this);
pd.setCancelable(true);
pd.setMessage("Loading...");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setProgress(0);
pd.setMax(3);
pd.show();
//incrementProgressBy
new Thread(new Runnable() {
@Override
public void run() {
try
{
while(pd.getProgress()<=pd.getMax())
{
Thread.sleep(1000);
//collect data and populate database table
//query data and populate arrays
handler.sendMessage(handler.obtainMessage());
if(pd.getProgress()==pd.getMax())
{
pd.dismiss();
adapter = new ListViewCustomAdapter(Calllogs.this, arr_calllog_name, arr_calllog_phone, arr_calllog_type,arr_calllog_duration, arr_calllog_date);
lv1.post(new Runnable() {
public void run() {
lv1.setAdapter(adapter);
}});
}
}
}catch(Exception e){}
}
}).start();
И обработчик:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
pd.incrementProgressBy(1);
//pd.dismiss();
}
};
EDIT: я случайно узнал, что вся таблица населения стала бесконечной петлей. Я проверил таблицу с помощью браузера базы данных sqlite, и сначала у него было 21 элемент, через пару секунд после 59, и он увеличился и, наконец, закрылся.
РЕШЕНИЕ:
Я не могу поверить, что не видел этого. Нить началась с населения, и это привело к бесконечному циклу. Я должен был поставить его после запроса calllog и перед запросом базы данных.
Я не могу поверить, что не видел этого. Нить началась с населения, и это привело к бесконечному циклу. Я должен был поставить его после запроса calllog и перед запросом базы данных.
ProgressDialog
(так что вы не входите в бесконечном воwhile
цикла)?