Android开发之异步获取并下载网络资源-下载图片和下载文本内容
在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);
Android开发之异步获取并下载网络资源-下载图片和下载文本内容的更多相关文章
- Android开发之使用URL訪问网络资源
Android开发之使用URL訪问网络资源 URL (UniformResource Locator)对象代表统一资源定位器,它是指向互联网"资源"的指针. 资源能够是简单的文件或 ...
- Android开发之异步具体解释(二)之AsyncTask
请尊重他人的劳动成果,转载请注明出处:Android开发之异步具体解释(二)之AsyncTask http://blog.csdn.net/fengyuzhengfan/article/details ...
- android开发中fragment获取context
在用到fragment时无法使用.this来指定当前context内容,android开发中fragment获取context,可以使用getActivity().getApplicationCont ...
- js&jquery 获取select下拉框的值、文本内容、自定义属性
js&jquery 获取select下拉框的值.文本内容.自定义属性 CreationTime--2018年7月2日09点22分 Author:Marydon html <selec ...
- Android开发:LocationManager获取经纬度及定位过程(附demo)
在Android开发其中.常常须要用到定位功能,尤其是依赖于地理位置功能的应用.非常多人喜欢使用百度地图,高德地图提供的sdk.开放API,可是在只须要经纬度,或者城市,街道地址等信息.并不须要提供预 ...
- Android开发之全局获取Context的技巧
转自<第一行代码-Android>进阶篇 这本书对于入门来说确实很棒,很简单明了的介绍了Android开发中涉及到的方方面面,对我的帮助很大,同时记录一些该书中一些对我以后开发有用的东西, ...
- android开发,权限获取
转:http://blog.csdn.net/yawinstake/article/details/6748897 访问登记属性 android.permission.ACCESS_CHECKIN_P ...
- android开发的权限获取 (转载的)
访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permiss ...
- Android开发之异步消息处理机制Handler
更加详细的介绍Handler的博文-http://blog.csdn.net/guolin_blog/article/details/9991569 Android中的异步消息处理主要有四个部分组成, ...
随机推荐
- 【HDOJ】1258 Sum It Up
典型的深搜,剪枝的时候需要跳过曾经搜索过的相同的数目,既满足nums[i]=nums[i-1]&&visit[i-1]==0,visit[i-1]==0可以说明该点已经测试过. #in ...
- simplified build configuration
http://blogs.msdn.com/b/saraford/archive/2005/08/16/452411.aspx Did you know… That you can hide the ...
- BZOJ_1609_[Usaco2008_Feb]_Eating_Together_麻烦的聚餐_(动态规划,LIS)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1609 给出一串由1,2,3组成的数,求最少需要改动多少个数,使其成为不降或不升序列. 分析 法 ...
- win7系统自带截图工具快捷键是什么?怎么设置快捷键
win7自带的截图工具很好,很强大,比从网上下载的截图工具好用多了,很少会出现问题.但是它能不能像QQ截图工具一样可以使用快捷键呢?今天小编和大家分享下心得,希望能够给你的工作带来快捷. 工具/原料 ...
- 安全delete,添加refenerce,release
#ifndef SAFE_ADDREF#define SAFE_ADDREF(p) if (p != NULL) { p->AddRef(); }#endif #ifndef SAFE_R ...
- acm位运算应用 搜索
acm位运算应用 搜索 搜索 此处不讲题目,只讲位运算是怎样在这些题中实现和应用的.由于搜索题往往是基于对状态的操作,位运算往往特别有效,优化之后的效果可以有目共睹. 例1.POJ 132 ...
- javaweb之servlet 全解
①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...
- oracle 高水位线
一.oracle 高水位线详解 一.什么是水线(High Water Mark)? 概念: 1.块: 是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是 ...
- Weka 自动优化参数
import weka.core.*; import weka.classifiers.*; import weka.classifiers.meta.*; import weka.classifie ...
- Spark RDD概念学习系列之RDD的容错机制(十七)
RDD的容错机制 RDD实现了基于Lineage的容错机制.RDD的转换关系,构成了compute chain,可以把这个compute chain认为是RDD之间演化的Lineage.在部分计算结果 ...