Не удается заставить publishProgress работать правильно.Помогите? - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть AsyncTask, который принимает URL-адреса и получает длину содержимого для всех пропущенных URL-адресов.Я бы хотел, чтобы индикатор выполнения обновлялся в строке заголовка и отображал окно оповещения, когда оно получит окончательное значение.Но мне трудно понять, как заставить все это работать вместе.Код, который у меня есть, теперь перемещает индикатор выполнения, но окно предупреждения не отображается.У меня нет пользовательской строки заголовка, вместо этого я вызываю requestWindowFeature (FEATURE_PROGRESS).Любая помощь будет принята.

Это мой класс Async

    private class MyClass extends AsyncTask<URL, Integer, Float>
    {
         protected Float doInBackground(URL... urls)
         {
              try
              {
                for(int i = 0; i<urls.length; i++)
                {
                    url = urls[i];
                    urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.setDoOutput(true);
                    urlConnection.connect();
                    size = urlConnection.getContentLength();
                    total += size; 
                    while(progress<total)
                    {
                        progress++;
                        publishProgress(progress);
                    }

                }
            }
            catch(MalformedURLException e)
            {
                e.printStackTrace();
            }
            catch(IOException iox)
            {
                iox.printStackTrace();
            }
            finally
            {
                urlConnection.disconnect();
            }
               return total;
    }

       protected void onProgressUpdate(Integer... values)
       {
        setProgressBarVisibility(true);
        setProgress(values[0]);     
   }

Редактировать: я понимаю, что publishProgress передает данные в onProgressUpdate из метода doInBackground.Но с помощью приведенного выше кода все длины содержимого URL-адресов добавляются к «общему».И я думаю, что приведенный выше код является правильным.Моя реализация этого: Нажмите кнопку из основного класса.Эта кнопка передает все URL-адреса в AsyncTask.В то время как URL-адреса получают длину и добавляют к общему (в фоновом режиме) в строке заголовка появляется индикатор выполнения, пока не будет выполнена фоновая работа.Затем в диалоговом окне с предупреждением пользователю предлагается сделать выбор.

Что происходит, если индикатор выполнения достигает конца и диалоговое окно с предупреждением не отображается.Перед тем, как я начал добавлять этот индикатор, появилось диалоговое окно с предупреждением.Теперь это не так.Как я могу добиться того, чтобы индикатор выполнения увеличивался должным образом с длиной содержимого URL-адреса .... отклонить индикатор выполнения ..... и затем загрузить диалоговое окно предупреждения в onPostExecute?

    protected void onPostExecute(final Float result)
    {       

        setProgressBarVisibility(false);

        AlertDialog.Builder alertbox = new AlertDialog.Builder(Vacation.this);
        alertbox.setMessage(TEXT STUFF);
        alertbox.setPositiveButton("Yes", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface arg0, int arg1) 
            {

            }
        });
        alertbox.setNegativeButton("No", new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface arg0, int arg1)
            {

            }
        });
        alertbox.show();    

    } 

1 Ответ

0 голосов
/ 23 сентября 2011

sat - это правильно, но вы можете сделать это в методе onPostExecute (), который имеет доступ к потоку пользовательского интерфейса, всегда помните, что только у doInBackground () нет доступа к потоку пользовательского интерфейса, остальные 3 метода имеют если вам нужно больше, чем конкретно, покажите код, в котором вы находите трудности.

...