安卓中异步任务实现带下载进度的根据图片地址下载图片

来源:互联网 发布:三季稻知乎 编辑:程序博客网 时间:2024/05/23 10:56

点击下载后将图片显示出来:


布局文件:

<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:layout_gravity="center" >    <ImageView         android:id="@+id/img"        android:layout_width="300dp"        android:layout_height="300dp"        android:src="@drawable/liu"        android:background="#00ff00"        />    <Button        android:id="@+id/bt"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="下载图片"         android:onClick="download"/>    <Button        android:id="@+id/cancle"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="取消下载"         android:onClick="cancle"/></LinearLayout></span>


逻辑代码文件:

<span style="font-size:18px;">package mars.day7_download;import java.io.ByteArrayOutputStream;import java.io.InputStream;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import android.app.Activity;import android.app.ProgressDialog;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.widget.ImageView;public class DownloadP extends Activity {ImageView img;DownloadTask downloadtask;String imgurl="http://www.guaiwei.com/uploads/allimg/150326/28-150326141503.png";ProgressDialog progressdialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.download_picture);img=(ImageView) findViewById(R.id.img);}public void download(View v){downloadtask=new DownloadTask();downloadtask.execute(imgurl);}public void cancle(View v){downloadtask.cancel(true);}//异步类public class DownloadTask extends AsyncTask<String,Integer,byte[]>{//首次调用加载@Overrideprotected void onPreExecute() {super.onPreExecute();progressdialog=new ProgressDialog(DownloadP.this);progressdialog.setTitle("下载图片");progressdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);progressdialog.setMessage("正在下载...");progressdialog.show();}//下载@Overrideprotected byte[] doInBackground(String... params) {if(!this.isCancelled()){//创建请求客户端HttpClient hclient=new DefaultHttpClient();//请求  imgurl=params[0]HttpGet request=new HttpGet(params[0]);//字节输出流存放要下载的文件ByteArrayOutputStream bo=new ByteArrayOutputStream();try {//得到客户端执行请求的结果HttpResponse response=hclient.execute(request);//请求成功执行的操作if(response.getStatusLine().getStatusCode()==200){//得到请求的实体内容InputStream in = response.getEntity().getContent();byte b[]=new byte[1024];int count=0;//得到文件的长度long file_length = response.getEntity().getContentLength();//每次读取的长度int current_length = 0;while((count=in.read(b))!=-1){//当前下载的长度current_length+=count;//当前下载进度的百分比int progress = (int)((current_length/(float)file_length)*100);//发送刻度单位到ui线程,onProgressUpdate里进行更新进度,显示到进度条publishProgress(progress);bo.write(b,0,count);bo.flush();}}//流转换成数组返回return bo.toByteArray();} catch (Exception e) {e.printStackTrace();}}return null;}//下载完成执行,更新ui@Overrideprotected void onPostExecute(byte[] result) {super.onPostExecute(result);//下载的内容传过来后解码放到位图工厂bo.toByteArray()=resultBitmap bm = BitmapFactory.decodeByteArray(result, 0, result.length);//显示到图片控件img.setImageBitmap(bm);progressdialog.dismiss();}//更新进度@Overrideprotected void onProgressUpdate(Integer... values) {super.onProgressUpdate(values);//progress=values[0]progressdialog.setProgress(values[0]);}@Overrideprotected void onCancelled() {super.onCancelled();progressdialog.dismiss();downloadtask.cancel(true);}}}</span>



0 0