使用AsyncTask后台下载图片并在UI更新进度条和现实图片

UI上的设定就不贴了,下面是fragment相应类的,基本上可以直接用到Activity上去(受权威指南影响,现在强烈喜爱Fragment)

 1 public class DownloadFragment extends Fragment {
 2
 3     Button mFetchButton;
 4     ProgressBar mProgressBar;
 5     EditText mURLEditText;
 6     ImageView mImageView;
 7
 8     @Override
 9     public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
10         View v=inflater.inflate(R.layout.fragment_down,container,false);
11
12         mFetchButton=(Button)v.findViewById(R.id.download);
13         mProgressBar=(ProgressBar)v.findViewById(R.id.progress);
14         mURLEditText=(EditText)v.findViewById(R.id.editURL);
15         mImageView=(ImageView)v.findViewById(R.id.image);
16         mFetchButton.setOnClickListener(new View.OnClickListener() {
17             @Override
18             public void onClick(View v) {
19                 String url;
20                 if((url=mURLEditText.getText().toString()).equals("")){
21                     Toast.makeText(getActivity(),"请输入网址",Toast.LENGTH_LONG).show();
22                 }else{
23                     new DownloadImageTask().execute("http://"+url);
24                 }
25             }
26         });
27         return v;
28     }
29
30     private class DownloadImageTask extends AsyncTask<String,Integer,Void>{
31
32         Bitmap map;
33
34         @Override
35         protected Void doInBackground(String... params) {
36             try{
37                 URL url=new URL(params[0]);
38                 HttpURLConnection connection=(HttpURLConnection)url.openConnection();
39
40                 /*从http头解析出下载的数据总体大小,只能解析静态页面的数据*/
41                 connection.setRequestProperty("Accept-Encoding", "identity");
42                 int total=connection.getContentLength();
43
44                 ByteArrayOutputStream out=new ByteArrayOutputStream();
45                 InputStream in=connection.getInputStream();
46
47                 byte[] buffer=new byte[1024];
48                 int count;
49                 int progress=0;
50                 while ((count=in.read(buffer))>0){
51                     out.write(buffer,0,count);
52                     progress += count*100/total;
53                     publishProgress(progress);
54                 }
55                 out.close();
56                 in.close();
57                 publishProgress(100);
58                 map=BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.toByteArray().length);
59 //                return new String(out.toByteArray());
60             } catch (IOException e){
61                 Log.e("Download Fragment","could not open a URL",e);
62             }
63             return null;
64         }
65         @Override
66         protected void onPostExecute(Void params){
67             mImageView.setImageBitmap(map);
68         }
69
70         @Override
71         public void onProgressUpdate(Integer...params){
72             int progress=params[0];
73             mProgressBar.setProgress(progress);
74         }
75     }
76 }

有一句

return new String(out.toByteArray());

这句话是在下载网页的时候返回结果的。

其中尚未解决的问题是无法解决URL无法解析的时候出现的异常,和在下载非静态网页(没有有Content-Length属性)的时候,无法比较正常的显示进度。

已知的问题是当服务器中的数据js,css等数据比较多的时候,会按照一定大小把数据加载到服务器缓存中在发送给客户端,但是由于缓冲区大小有限,每次只能把缓冲的数据发送完才能继续传送下一块数据,这里由于我们不知晓服务器详细,所以无法要求服务器返回数据大小,因此无法正常计算进度。

时间: 2024-10-20 02:42:37

使用AsyncTask后台下载图片并在UI更新进度条和现实图片的相关文章

基于jQuery带进度条全屏图片轮播代码

基于jQuery带进度条全屏图片轮播代码.这是一款基于jQuery实现的oppo手机官网首页带进度条全屏图片轮播特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="pic"> <ul> <li style="background: url(images/bg1.jpg) center;"> <img src="images/con1.png"> <

【笔记】canvas图片预加载及进度条的实现

/*star *loading模块 *实现图片的预加载,并显示进度条 *参数:图片数组对象,加载完成的回调函数 */ function loadImages(sources,callback){ var loadedImages = 0; var numImages = 0; ctx.font='14px bold'; ctx.lineWidth=5; var clearWidth=canvas.width; var clearHeight=canvas.height; // get num o

UI UIView进度条,模拟手机充电功能

#import "JRProgres.h" @implementation JRProgres { UIView * _contentView; } - (instancetype)initWithFrame:(CGRect)frame{// 重写构造方法一次创建3个视图,分别为最外层的绿框.子1白底.子2红条 self = [super initWithFrame:frame]; if (self) { //1. 设置边框为绿色 self.backgroundColor = [UIC

Android UI(四)云通讯录项目之云端更新进度条实现

作者:泥沙砖瓦浆木匠 网站:http://blog.csdn.net/jeffli1993 个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583]http://jq.qq.com/?_wv=1027&k=XVfBTo 一.前言 继续AndroidUI系列,UI其实是个前端活,美感是最终的boss阶段.泥瓦匠的美感也就给你们评论评论哈哈,我等UI写到一定地步.我想写下Android的一系列简单入门.为了巩固提升呗.哈哈.下面介入正题.   

95秀-PK 动画 进度条 描边 圆角图片

PK界面 <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Rela

javascript实现在图片读取的时候出现进度条….

<title>JS实现的图片加载进度条_网页代码站(http://www.frontopen.com</title> <script> var l=0; var imgs; var sum=0; function chk(){ document.getElementById(“aa”).innerText=””+((sum-l)*100/sum)+”%” l–; if (l==0){ for (var i=0;i<imgs.length;i++){ imgs[i]

11 Jquery UI Progressbar 进度条插件

原文地址:https://www.cnblogs.com/springsnow/p/9461721.html

C# 下载带进度条代码(普通进度条)

<span style="font-size:14px;"> </span><pre name="code" class="csharp"><span style="font-size:14px;"> /// <summary> /// 下载带进度条代码(普通进度条) /// </summary> /// <param name="URL&

Android多线程分析之五:使用AsyncTask异步下载图像

Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<Android多线程分析之中的一个:使用Thread异步下载图像>中.曾演示了怎样使用 Thread 来完毕异步任务. Android 为了简化在 UI 线程中完毕异步任务(毕竟 UI 线程是 app 最重要的线程).实现了一个名为 AysncTask 的模板类.使用 AysncTask 能够在异步任务进行的同