2012-03-08 2 views
3

Я хочу показать ProgressDialog, в то время как программно он добавляет многократные представления в макет. Я объявил ProgressDialog в основном мероприятии, а затем запущен AsyncTask, который добавляет кратность. В onPostExecute AsyncTask ProgressDialog отклоняется. Приложение работает, но проблема в том, что запуск медленный, и ProgressDialog кратковременно замерзает. Это основной цикл AsyncTask. Колонка расширяет LinearLayout.Добавление кратных просмотров freeze ProgressDialog

for(int i=0;i<7;i++){     
    ((LinearLayout) Global.a.findViewById(R.id.scrollLayout)).addView(new Column(Global.a,i));     
} 

ответ

3

Только основываясь на фрагменте кода, в этом случае вы неправильно используют AsyncTask.

for(int i=0;i<7;i++){ 

    ((LinearLayout) Global.a.findViewById(R.id.scrollLayout)).addView(new Column(Global.a,i));     
} 

Этого никогда не должно быть сделано в AysncTask. Если это делается doInBackground, вы изменяете пользовательский интерфейс из другого потока, если он выполняется где-то еще (onPreExecute(), onPostExecute() или onProgressUpdate(), тогда вы запускаете цикл for в потоке пользовательского интерфейса.

наилучшим решением было бы создать файл XML с видом вы хотите добавить к нему уже в нем. Хотя, если вы намерены добавлять взгляды в AsyncTask, то вам необходимо изменить, как его сделать.

private SomeName extends AsyncTask<Void,Column,Void>{ 
    private Linearlayout layout; 

    protected void onPreExecute(Void... unused){ 
     //UI thread 
     //show dialog 
     layout = (LinearLayout) Global.a.findViewById(R.id.scrollLayout); 
    } 
    protected void doInBackground(Void... unused){ 
     //Background thread 
     for(int i=0;i<7;i++){ 
      //create the view in the background 
      Column column = new Column(Global.a,i); 
      //call publish progress to update the UI     
      publishProgress(column); 
     } 
    } 

    protected void onProgressUpdate(Column... column){ 
     //UI thread 
     //Update the UI 
     layout.addView(column[0]); 
    } 

    protected void onPreExecute(Void... unused){ 
     //UI thread 
     //dismiss dialog 
    } 
} 
+0

Танк вам очень нравится. –

0

, так как вы не отправлял никакого кода, что я могу только предположить, пусть ваш progressDialog быть частью AsyncDialog и поставить ProgressDialog.show в AsyncTask-х onPreExecute

+0

Баки подсказка, но не сработала. У меня есть вопрос с некоторым кодом. –

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