在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源。首先看看实例效果图:
下载图片截图 下载文本文件内容截图
下面介绍如何来实现这样的开发:
(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 = { "https://images0.cnblogs.com/i/322919/201405/181111308592436.png", "https://images0.cnblogs.com/i/322919/201405/181111385003770.png", "https://images0.cnblogs.com/i/322919/201405/181111493901865.png", "https://images0.cnblogs.com/i/322919/201405/181111550463327.png", "https://images0.cnblogs.com/i/322919/201405/181117587961455.png", "https://images0.cnblogs.com/i/322919/201405/181118041251414.png", "https://images0.cnblogs.com/i/322919/201405/181119313754936.png", "https://images0.cnblogs.com/i/322919/201405/181119357816682.png", "https://images0.cnblogs.com/i/322919/201405/181119458753432.png", "https://images0.cnblogs.com/i/322919/201405/181119499372608.png", "https://images0.cnblogs.com/i/322919/201405/181120173901329.png", "https://images0.cnblogs.com/i/322919/201405/181120244849561.png", "https://images0.cnblogs.com/i/322919/201405/181120357812013.png", "https://images0.cnblogs.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);