Android AsyncTask异步实现大文件下载
2015-11-14 00:13
387 查看
Android AsyncTask异步实现大文件下载
![异步下载显示图片](http://img.blog.csdn.net/20151114001557431) public class Third extends Activity { private Button btn; private ImageView iv; private TextView textview; private Handler handlers; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.download); btn = (Button) findViewById(R.id.btn); iv = (ImageView) findViewById(R.id.iv); textview = (TextView) findViewById(R.id.textview); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DownLoadImageTask imt = new DownLoadImageTask(); imt.execute("http://img2.niutuku.com/desk/1208/0850/bizhi-0850-17120.jpg");//传一个网址 } }); handlers = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what==0x001){ Log.e("---------------------", "" + msg.obj); textview.setText(msg.obj.toString()); }else if(msg.what==0x002){ Bitmap bitmap = (Bitmap) msg.obj; iv.setImageBitmap(bitmap); } } }; } /** * 完成图片下载的异步任务 * @author Administrator * */ class DownLoadImageTask extends AsyncTask<String, Integer, byte[]> {//参数含义:传进去的值;后台百分比;返回的结果 private ProgressDialog progressDialog;//进度条 private byte[] current = new byte[2 * 1024];//每次读到的字节数组 private byte[] total;//下载图片后汇总的字节数组 private boolean flag; //是否被取消 //任务执行之前回调 @Override protected void onPreExecute() { progressDialog = new ProgressDialog(Third.this); progressDialog.setMessage("正在操作中,请稍候……"); progressDialog.setMax(100);//进度条最大值 progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//水平样式 progressDialog.setIndeterminate(false);//进度条的动画效果(有动画则无进度值) flag = true; //退出对话框事件 progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { flag = false; } }); progressDialog.show(); } @Override protected byte[] doInBackground(String... params) {//字符串数组 try { //创建URL对象,用于访问网络资源 URL url = new URL(params[0]); //获得HttpUrlConnection对象 HttpURLConnection http = (HttpURLConnection) url.openConnection(); //设置超时时间 http.setConnectTimeout(5000); //获得总长度 int length = http.getContentLength(); Log.d("=======", length + ""); //为total分配空间 total = new byte[length]; //开始读取数据 int pointer = 0;//已用掉的索引 InputStream is = http.getInputStream(); int real = is.read(current); //读取当前批次的字节并保存到数组中 while(flag && real > 0){ //如果读取到了字节,则保存到total中 for(int i = 0; i < real; i ++){ total[pointer + i] = current[i]; } //指针向后移 pointer += real; //计算进度 int progress = (int)((double)pointer / length * 100);//先计算出百分比在转换成整型 //更新进度 publishProgress(progress, pointer, length); //继续读取下一批 real = is.read(current); } //关闭流对象 is.close(); //将获得的所有字节全部返回 return total; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } //更新进度条回调 @Override protected void onProgressUpdate(Integer... values) { progressDialog.setMessage( String.format("已读%d M, 共%d M",//字节为单位 values[1] / 1024 / 1024, values[2] / 1024 / 1024));//将values[1]赋给第一个%d,第二个同理 progressDialog.setProgress(values[0]);//进度动态提示 Message message001 = handlers.obtainMessage(0x001); message001.obj=values[0]; handlers.sendMessage(message001); } //任务被取消时回调 @Override protected void onCancelled() { super.onCancelled(); Toast.makeText(getApplication(),"任务已取消",Toast.LENGTH_SHORT).show(); } //任务结束后回调 @Override protected void onPostExecute(byte[] result) { progressDialog.dismiss();//关闭对话框 Bitmap bitmap = null; if(flag){ //将获得的字节数组转换成Bitmap图片对象(在安卓中用位图显示图片) bitmap = BitmapFactory.decodeByteArray( result, 0, result.length); //iv.setImageBitmap(bitmap); Message message002 = handlers.obtainMessage(0x002); message002.obj=bitmap; handlers.sendMessage(message002); } flag = false; //回收内存 if(!flag && !bitmap.isRecycled()){ //bitmap.recycle(); } } } } download.xml文件:----------------------------------- <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="match_parent" /> <ProgressBar style="?android:attr/progressBarStyleHorizontal" android:layout_gravity="center_vertical|center_horizontal" android:id="@+id/progressbar" android:layout_width="200dp" android:layout_height="20dp" /> <TextView android:textColor="#FF0000" android:id="@+id/textview" android:layout_below="@id/progressbar" android:gravity="center_horizontal" android:textSize="14dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@android:color/holo_blue_dark" android:text="下载图片" android:textColor="#FFFFFF" /> </RelativeLayout>
相关文章推荐
- android中的Dialog的使用
- 几步实现Android 开发中的弹窗效果
- Android 开发之创建桌面快捷图标
- Android studio 解决问题Default Activity not found
- [实践] Android源码 - Android系统初始化时创建自定义目录
- 详解Android触摸事件处理程序
- 【Android粒子动画】Android粒子动画渲染学习
- Android Launcher3的自定义修改总结
- Android按下返回键后,程序不退出,进入后台运行。使用moveTaskToBack(boolean nonRoot)
- Android消息机制
- 从源码角度解析Android消息机制
- 彻底搞懂Android Handler消息机制
- Android_SVG概述及生成使用SVG详解
- Android最牛的开源整理
- android抽屉效果
- Android新特性v7 - CardView
- android事件总线 otto使用
- Android打包签名(Keytool)
- Android自定义控件之日历控件
- android studio gradle更新错误