Android实现异步获取并下载图片等网络资源(HttpURLConnection)

分类:手机开发| 发布:佚名| 查看: | 发表时间:2014/10/29

  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 @camnpr
            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@camnpr
                        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.LENGTH_SHORT).show();
        }
        
    }
异步下载文本文件内容任务:
private class DownloadTextTask extends AsyncTask<String, Void, String>{
 
        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub@ 郑州网建
            Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();
        }
 
        @Override
        protected String doInBackground(String... urls) {
            // TODO Auto-generated method stub
            return downloadText(urls[0]);
        }
        
    }
这样一来,异步下载网络资源就完成了。
下面为了读者方便测试,下面提供本文实例代码中的相关网络资源URL,以方便大家自己测试使用。其余非核心代码就不在贴出来,望读者见谅。
//图片下载URLs
private String[] mUrl =
        {
            "upload/2014/10/201410291617535367.png",
            "upload/2014/10/201410291617538135.png",
            "upload/2014/10/201410291617546704.png",
            "upload/2014/10/201410291617548700.png",
            "upload/2014/10/201410291617554810.png",
            "upload/2014/10/201410291617553457.png",
            "upload/2014/10/201410291617567648.png",
            "upload/2014/10/201410291617568687.png",
            "upload/2014/10/201410291617570376.png",
            "upload/2014/10/201410291617570767.png",
            "upload/2014/10/201410291617585856.png",
            "upload/2014/10/201410291617585716.png",
            "upload/2014/10/201410291617595542.png",
            "upload/2014/10/201410291617593754.png"
        };
progressBar = (ProgressBar) findViewById(R.id.progressBar);
progressBar.setMax(mUrl.length*10);
progressBar.setVisibility(View.VISIBLE);
//异步下载图片任务
DownloadImageTask task = new DownloadImageTask(progressBar);
task.execute(mUrl);
//文本文件URL @郑州网建
String strUrl = "http://www.sogou.com/docs/about.htm";
 
//异步下载文本文件内容任务
new DownloadTextTask().execute(strUrl);
365据说看到好文章不转的人,服务器容易宕机
原创文章如转载,请注明:转载自郑州网建-前端开发 http://camnpr.com/
本文链接:http://camnpr.com/mobile-dev/1702.html