Вам нужно взглянуть на класс ProgressBar и использовать его в основном во время загрузки изображения. В качестве альтернативы вы можете поместить изображение по умолчанию во время загрузки изображения.
Чтобы поместить индикатор выполнения в ваш код, проще всего просто перевернуть их видимость в макете.
- В вашем макете есть две вещи. Один заполнитель для ProgressBar , а другой для изображения
- Индикатор выполнения изначально установлен на VISIBLE, а изображение на GONE
- После выполнения AsyncTask (см. Ниже) вам необходимо изменить видимость. В основном измените индикатор выполнения на УТРА, а изображение на ВИДИМ
Вот что вы должны попытаться сделать. Проверьте примечание и комментарий TODO в коде. Примечание: я только что изменил ваш код, но не запустил его, но этого должно быть достаточно, чтобы проиллюстрировать идею.
Некоторые ключевые моменты:
- Долгосрочная задача, которая может блокировать поток пользовательского интерфейса, должна выполняться в AsyncTask. В вашем случае это будет загрузка изображения
- Выполнение записи, которое необходимо обработать в пользовательском интерфейсе. Поток должен обрабатываться в postExecute ()
- Выполнение 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;
}
}