标题 | Android开发之异步获取并下载网络资源 |
内容 | 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.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 = { "http://images.cnitblog.com/i/322919/201405/181111308592436.png", "http://images.cnitblog.com/i/322919/201405/181111385003770.png", "http://images.cnitblog.com/i/322919/201405/181111493901865.png", "http://images.cnitblog.com/i/322919/201405/181111550463327.png", "http://images.cnitblog.com/i/322919/201405/181117587961455.png", "http://images.cnitblog.com/i/322919/201405/181118041251414.png", "http://images.cnitblog.com/i/322919/201405/181119313754936.png", "http://images.cnitblog.com/i/322919/201405/181119357816682.png", "http://images.cnitblog.com/i/322919/201405/181119458753432.png", "http://images.cnitblog.com/i/322919/201405/181119499372608.png", "http://images.cnitblog.com/i/322919/201405/181120173901329.png", "http://images.cnitblog.com/i/322919/201405/181120244849561.png", "http://images.cnitblog.com/i/322919/201405/181120357812013.png", "http://images.cnitblog.com/i/322919/201405/181120398596959.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); |
随便看 |
|
在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。