您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> 安卓开发 >> 正文

Android开发之异步获取并下载网络资源

作者:佚名    责任编辑:admin    更新时间:2022-06-22

  1)从指定的URL获取对应的流

  既然要获取网络资源,那么首先得有个URL,那么这里我首先封装一个打开URL连接获取到的InputStream 流,这样一来无论是图片资源还是文本文件资源都可以使用该接口方法来获取流。   该功能主要应用URLConnection和HttpURLConnection来实现,具体实现方案如下:   复制代码 private InputStream openHttpConnection(String urlString) throws IOException{                  InputStream in = null;         int response = -1;         URL url = new URL(urlString);         URLConnection conn = url.openConnection();                  if(!(conn instanceof HttpURLConnection)){             throw new IOException("It is not an HTTP connection");         }         try {             HttpURLConnection httpConn = (HttpURLConnection) conn;             httpConn.setAllowUserInteraction(false);             httpConn.setInstanceFollowRedirects(true);             httpConn.setRequestMethod("GET");             httpConn.connect();             response = httpConn.getResponseCode();             if (response == HttpURLConnection.HTTP_OK) {                 in = httpConn.getInputStream();             }         } catch (Exception ex) {             Log.v("Networking",ex.getLocalizedMessage());             throw new IOException("Error connecting");         }         return in;              } 复制代码 (2)封装了上面的获取流方法接口后,我们就可以利用上面封装的方法来获取并下载相应图片和文本文件内容了   获取并下载图片资源方法:   复制代码 private Bitmap downloadImage(String url){         Bitmap bitmap = null;         InputStream in = null;         try {             in = openHttpConnection(url);             bitmap = BitmapFactory.decodeStream(in);             in.close();         } catch (IOException e) {             // TODO Auto-generated catch block             Log.v("NetworkingActivity", e.getLocalizedMessage());         }         return bitmap;     } 复制代码     获取并下载文本内容方法:   复制代码 private String downloadText(String url){         int BUFFER_SIZE = 2000;         InputStream is = null;         try {             is = openHttpConnection(url);         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();             return "";         }         InputStreamReader isr = new InputStreamReader(is);         int charRead;         String str="";         char[] inputBuffer = new char[BUFFER_SIZE];         try {             while((charRead=isr.read(inputBuffer))>0){                 String readString = String.copyValueOf(inputBuffer, 0, charRead);                 str += readString;                 inputBuffer = new char[BUFFER_SIZE];             }             is.close();         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();             return "";         }                                    return str;     } 复制代码 (3)在获取下载图片资源和文本内容资源方法都完成后,现在就可以开始下载任务了,为了防止等待效应,一般采用异步任务来下载网络资源。   对对应的下载资源任务封装各自的异步下载任务即可。下面就是实现异步下载任务的方案:   异步下载图片任务:   复制代码 private class DownloadImageTask extends AsyncTask<String, Bitmap, Long>{                             long imagesCount = 0;         ProgressBar progressBar;         public DownloadImageTask(ProgressBar pBar){             this.progressBar = pBar;         }                  @Override         protected Long doInBackground(String... urls) {             // TODO Auto-generated method stub             for(int i = 0; i < urls.length;i++){                 Bitmap imageDownloaded = downloadImage(urls[i]);                 if(imageDownloaded!=null){                     imagesCount ++;                     publishProgress(imageDownloaded);                     try {                         Thread.sleep(300);                     } catch (InterruptedException e) {                         // TODO Auto-generated catch block                         e.printStackTrace();                     }                 }                              }             return imagesCount;                      }         //display the image downloaded         @Override         protected void onProgressUpdate(Bitmap... bitmaps) {             // TODO Auto-generated method stub             ivImg.setImageBitmap(bitmaps[0]);             progressBar.setProgress((int) imagesCount*10);         }         //when all the images have been downloaded         @Override         protected void onPostExecute(Long imageDownloaded) {             // TODO Auto-generated method stub             String str = "下载完成!一共下载了"+imagesCount +"张图片";             Toast.makeText(getBaseContext(), str, Toast.LEN