Android Помогите добавить диалог прогресса при загрузке изображения? - PullRequest
0 голосов
/ 24 августа 2011

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

Надеюсь, что кто-то может помочь

 ImageView imView;
 String imageUrl="http://domain.com/images/";
 Random r= new Random();
/** Called when the activity is first created. */ 
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,
            WindowManager.LayoutParams.FLAG_FULLSCREEN );

    setContentView(R.layout.galleryshow);

    Button bt3= (Button)findViewById(R.id.get_imagebt);
    bt3.setOnClickListener(getImgListener);
    imView = (ImageView)findViewById(R.id.imview);
}    

View.OnClickListener getImgListener = new View.OnClickListener()
{

      @Override
      public void onClick(View view) {
           // TODO Auto-generated method stub


           int i =r.nextInt(114);
           downloadFile(imageUrl+"image-"+i+".jpg");
           Log.i("im url",imageUrl+"image-"+i+".jpg");
      }

};


Bitmap bmImg;
void downloadFile(String fileUrl){
      URL myFileUrl =null;          
      try {
           myFileUrl= new URL(fileUrl);
      } catch (MalformedURLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
      }
      try {
           HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
           conn.setDoInput(true);
           conn.connect();
           int length = conn.getContentLength();
           InputStream is = conn.getInputStream();

           bmImg = BitmapFactory.decodeStream(is);
           imView.setImageBitmap(bmImg);
      } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
      }
 }
}

Ответы [ 3 ]

1 голос
/ 24 августа 2011

Вы должны посмотреть на это: Asynctask - это путь.

Android: загрузка изображения из Интернета с помощью Asynctask

С уважением, Стефан

0 голосов
/ 24 августа 2011

Другая тема:
Как отобразить Progressbar Когда данные загружаются из Интернета? , ответ от Blundell, просто скопируйте / вставьте класс. Я использую его в ListView, это довольно хорошо.
Вы можете указать URL-адрес в формате xml, во время создания представления или путем вызова setImageDrawable (String)

0 голосов
/ 24 августа 2011

Вам нужно взглянуть на класс ProgressBar и использовать его в основном во время загрузки изображения. В качестве альтернативы вы можете поместить изображение по умолчанию во время загрузки изображения.

Чтобы поместить индикатор выполнения в ваш код, проще всего просто перевернуть их видимость в макете.

  1. В вашем макете есть две вещи. Один заполнитель для ProgressBar , а другой для изображения
  2. Индикатор выполнения изначально установлен на VISIBLE, а изображение на GONE
  3. После выполнения AsyncTask (см. Ниже) вам необходимо изменить видимость. В основном измените индикатор выполнения на УТРА, а изображение на ВИДИМ

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

Некоторые ключевые моменты:

  1. Долгосрочная задача, которая может блокировать поток пользовательского интерфейса, должна выполняться в AsyncTask. В вашем случае это будет загрузка изображения
  2. Выполнение записи, которое необходимо обработать в пользовательском интерфейсе. Поток должен обрабатываться в postExecute ()
  3. Выполнение e.printStacktrace () во время перехвата Exception не является хорошей практикой. Без соответствующих дескрипторов это исключение обрабатывается неправильно и может привести к ошибкам в будущем. Кроме того, во время производства эта информация совсем не помогает, когда на стороне клиента возникают ошибки, поскольку она просто выводится на консоль


    View.OnClickListener getImgListener = new View.OnClickListener()
    {
        @Override
        public void onClick(View view) {
            // NOTE: here you need to show the progress bar, you could utilize ProgressBar class from Android
            // TODO: Show progress bar

            AsyncTask asyncTask = new AsyncTask() {
                @Override
                public Bitmap doInBackground(Void... params) {
                    int i =r.nextInt(114);

                    // NOTE: move image download to async task
                    return downloadFile(imageUrl+"image-"+i+".jpg");
                }

                @Override
                public void onPostExecute(Bitmap result) {
                    // TODO: hide the progress bar here 
                    // and flip the image to VISIBLE as noted above
                    if(result != null) {
                        imView.setImageBitmap(result);
                    } else {
                        // NOTE 3: handle image null here, maybe by showing default image
                    }
                }
            };

            // NOTE: execute in the background so you don't block the thread
            asyncTask.execute();
        }
    };

    // Change the return type to Bitmap so we could use it in AsyncTask
    Bitmap downloadFile(String fileUrl){
        URL myFileUrl =null;          
        try {
            myFileUrl= new URL(fileUrl);
        } catch (MalformedURLException e) {
            // NOTE: You should not have e.printStacktrace() here. In fact
            // printStacktrace is a bad practice as it doesn't really do anything
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            int length = conn.getContentLength();
            InputStream is = conn.getInputStream();

            Bitmap bmImg = BitmapFactory.decodeStream(is);

            // return image this to the main Thread
            return bmImg;
        } catch (IOException e) {
            return null;
        }
    }

...