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