Android AsyncTask异步实现大文件下载
16lz
2021-01-23
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 AsyncTaskbyte[]> {//参数含义:传进去的值;后台百分比;返回的结果 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"?>"http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> "@+id/iv" android:layout_width="match_parent" android:layout_height="match_parent" /> "?android:attr/progressBarStyleHorizontal" android:layout_gravity="center_vertical|center_horizontal" android:id="@+id/progressbar" android:layout_width="200dp" android:layout_height="20dp" /> "#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" />
更多相关文章
- android okgo post传数组
- Android 下载网络url文件并显示进度
- android 创建水平进度条
- android学习----ProgressBar 进度条
- android 渐变的半圆进度条
- 2.4.4 进度条
- android 网络读取图片 带进度条
- android 通过构造创建进度对话框
- android多线程进度条