2012-01-19 6 views
0

Позвольте мне объяснить, что это мое первое приложение для Android. Так что я пока не понимаю всех концепций. Я ожидаю, что эта проблема будет связана с отсутствием знаний, но на этот раз я не могу решить эту проблему.Android - создание диалогового окна прогресса, заполненного нитью

У меня есть этот фрагмент кода для извлечения некоторых данных из удаленной базы данных Mysql для заполнения ListView. Это прекрасно работает.

// fetch family and determine length of the arrays 
Familielid[] familie = Mysql.getFamilie(); 
int len = familie.length; 
namen = new String[len]; // groups 
lijsten = new String[len][]; // children 

// loop through the family and fill names and lists 
for (int i=0; i<len; i++) 
{ 
    namen[i] = familie[i].getNaam(); 
    Lijst lijst = new Lijst(Mysql.getLijst(familie[i].getId())); 
    lijsten[i] = lijst.getOmschrijvingen(); 
} 

Теперь, потому что это может занять некоторое время, я хочу показать прогресс бар, который заполняется для каждого (= члена семьи) «Familielid», который был загружен. (Я хочу сделать это таким образом, чтобы узнать, как это сделать) Этот код, однако, вызывает ошибку приложения. :(

// show progress bar while loading 
ProgressDialog progressDialog = new ProgressDialog(VerlanglijstenActivity.this); 
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
progressDialog.setMessage("Lijstjes ophalen..."); 
progressDialog.setCancelable(false); 
progressDialog.show(); 

// load lijstjes with progress bar 
Thread loadLijstjes = new Thread(new Runnable() { 
    public void run() { 
     // fetch family and determine length of the arrays 
     Familielid[] familie = Mysql.getFamilie(); 
     int len = familie.length; 
     namen = new String[len]; // groups 
     lijsten = new String[len][]; // children 

     // loop through the family and fill names and lists 
     for (int i=0; i<len; i++) 
     { 
      namen[i] = familie[i].getNaam(); 
      Lijst lijst = new Lijst(Mysql.getLijst(familie[i].getId())); 
      lijsten[i] = lijst.getOmschrijvingen(); 
      // show progress 
      progressDialog.incrementProgressBy((int) Math.floor(100/len)); 
     } 
     progressDialog.setProgress(100); // just make sure it's 100% when we're done 
     progressDialog.dismiss() ; // close the progress bar 
    } 
}); 
loadLijstjes.start(); 

Любая идея, что я делаю неправильно? Или это должно быть сделано совершенно по-разному?

+3

вы не может вызывать операции над объектами в потоке пользовательского интерфейса из другого потока. – waqaslam

ответ

1

Вот документ для отличного старта в некоторые подходы к решению threading in Android. Источник вашей проблемы заключается в том, что вы пытаетесь обновить свой пользовательский интерфейс из потока, отличного от UI. Это можно легко устранить, обратившись к фоновой работе в AsyncTask, как описано в документе, и поместив обновления прогресса в метод onProgressUpdate.

+0

Tha nks, я переписал для использования AsyncTask. Очень приятно, что то, что мне нужно, на самом деле полностью построено уже :) – winkbrace

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