Диалог зависает на Async Task Android - PullRequest
0 голосов
/ 12 декабря 2011

В своей деятельности я загружаю несколько изображений, а затем отображаю их, добавляя каждое из них в свой основной макет.Я попробовал эти 3 подхода, но каждый раз, когда мой диалог прогресса зависает до загрузки изображений:

1-й подход: использование асинхронной задачи: я загружаю изображения в doInBackground () и добавляю их в основной макет onPostExecute ()

2-й: То же, что и выше, но я добавляю каждое из изображений в OnProgressUpdate ()

3-й: Использование обработчика и потока

Каждый раз, когда диалоговое окно прогресса останавливаетсяв течение нескольких секунд (фактически все приложение зависает), пока изображения не будут загружены и отображены на экране.

Я пытался исправить это в течение длительного времени, но пока ничего.Есть идеи?Вот часть моего кода:

     protected Integer doInBackground(Void... params) {         
        //...
            try {
                //download images
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            if (!loadTask.isCancelled()) {                  
                //Display images        
                int length=imageList.size();        

                for (i=0; i<length; i++) {                      
                    publishProgress(i);                     
                }
            }               

        return 1;                       
    }

  protected void onProgressUpdate(Integer... a) {
        //interaction with UI thread
        int i = a[0];
        ImageView im = new ImageView (MyActivity.this);
        im.setImageBitmap(getRemoteImage(imageUrl));
        im.setLayoutParams(Params);
        im.setAdjustViewBounds(true);
        im.setPadding(px2, px2, px2, px2);
        im.setOnClickListener(new OnClickListener() {
              public void onClick(View v) {
                  //...
              }               
        });
    }

1 Ответ

2 голосов
/ 12 декабря 2011
im.setImageBitmap(getRemoteImage(imageUrl));

Если getRemoteImage() делает то, что предполагает его имя и аргумент (загрузка изображения из Интернета) , то эта строка - ваша проблема, так как она выполняется в onProgressUpdate().

onProgressUpdate() работает в потоке пользовательского интерфейса, а не в фоновом потоке, он должен выполнять работу пользовательского интерфейса, когда прогресс изменяется.Когда вы загружаете изображения здесь, вы блокируете поток пользовательского интерфейса на время, необходимое для завершения загрузки изображения.Поскольку вы перебираете все изображения, он будет удерживать ваш поток пользовательского интерфейса до тех пор, пока все ваши изображения не будут загружены.

Скорее запустите загрузку в doInBackground() (ваш комментарий в начале метода предполагает, что вы уже это делаете) и передайте загруженное изображение в onProgressUpdate через аргумент, которыйpublishProgress() дубль.

...