码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-09 22:50:45      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

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

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

标签:

原文地址:http://www.cnblogs.com/lhyz/p/4282552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!