Android开发之异步获取并下载网络资源
来源: 阅读:3427 次 日期:2014-08-21 15:48:29
温馨提示: 小编为您整理了“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);

更多信息请查看IT技术专栏

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map