Я бы настоятельно рекомендовал вместо этого использовать AsyncTask . Первоначально я использовал URL.openStream , но у него есть проблем .
class DownloadThread extends AsyncTask<URL,Integer,List<Bitmap>>{
protected List<Bitmap> doInBackground(URL... urls){
InputStream rawIn=null;
BufferedInputStream bufIn=null;
HttpURLConnection conn=null;
try{
List<Bitmap> out=new ArrayList<Bitmap>();
for(int i=0;i<urls.length;i++){
URL url=urls[i];
url = new URL("http://mysite/myimage.png");
conn=(HttpURLConnection) url.openConnection()
if(!String.valueOf(conn.getResponseCode()).startsWith('2'))
throw new IOException("Incorrect response code "+conn.getResponseCode()+" Message: " +getResponseMessage());
rawIn=conn.getInputStream();
bufIn=new BufferedInputStream();
Bitmap b=BitmapFactory.decodeStream(in);
out.add(b);
publishProgress(i);//Remove this line if you don't want to use AsyncTask
}
return out;
}catch(IOException e){
Log.w("networking","Downloading image failed");//Log is an Android specific class
return null;
}
finally{
try {
if(rawIn!=null)rawIn.close();
if(bufIn!=null)bufIn.close();
if(conn!=null)conn.disconnect();
}catch (IOException e) {
Log.w("networking","Closing stream failed");
}
}
}
}
В этом случае трудно закрыть поток / соединение и обработку исключений. Согласно Sun Documentation вам нужно только закрыть самый внешний поток, однако кажется, что он более сложный . Однако сначала я закрываю самый внутренний поток, чтобы убедиться, что он закрыт, если мы не можем закрыть BufferedInputStream
.
Мы закрываем в конце, чтобы исключение не мешало их закрытию. Мы учитываем возможность того, что потоки будут null
, если исключение помешало их инициализации. Если у нас есть исключение во время закрытия, мы просто регистрируем и игнорируем это. Даже это может не работать должным образом, если возникает ошибка во время выполнения.
Вы можете использовать класс AsyncTask
следующим образом. Запустите анимацию в onPreExecute
. Обновите прогресс в onProgressUpdate
. onPostExecute
должен обрабатывать фактические изображения. Используйте onCancel
, чтобы позволить пользователю отменить операцию. Начните с AsyncTask.execute
.
Стоит отметить, что исходный код и лицензия позволяют нам использовать этот класс в проектах, отличных от Android.