使用ProgressBar和AsyncTask 下载图片android
功能:一个下载按钮 从网络上下载图片 显示到该页面上
//记得配置联网权限api
一、在布局界面布局 activity_main.xml服务器
代码网络
<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" >
<!-- ProgressBar的类型 style="?android:attr/progressBarStyleHorizontal"-->
<ProgressBar
android:id="@+id/progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:visibility="gone"
/>
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/bt_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载图片"
android:textSize="30sp"
android:onClick="downLoad"/>
ide
</LinearLayout>工具
--------------------------------------布局
二、MainActivity 类this
代码url
public class MainActivity extends Activity {
private ProgressBar pb;
private ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.pb = (ProgressBar) this.findViewById(R.id.progress);
this.image = (ImageView) this.findViewById(R.id.image);
}
//下载 按钮的 事件监听
public void downLoad(View view){
String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg";
//启动 该工具类
new MyAsyncTask().execute(url);
}
//第一个 参数 -- 要下载的 地址
//第二个 参数 -- 设置 进度条参数为 整型
//第三个参数 -- 获得 下载完 数据 返回来 的数据 类型
class MyAsyncTask extends AsyncTask<String, Integer, byte[]>{code
@Override//一、该 工具类 先 执行 onPreExecute protected void onPreExecute() { super.onPreExecute(); //显示 进度条 pb.setVisibility(View.VISIBLE); } //三、在 该 工具类里 在执行 onProgressUpdate 更新 进度条 @Override //用于 更新进度条的 方法 protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); //在这里 接收 doInBackground 传递 要更新 进度条 的 多少 pb.setProgress(values[0]); } //二、该工具类 而后 执行 doInBackground @Override //下载 图片数据 protected byte[] doInBackground(String... params) { //准备 用HttpClient 方式 联网 下载 数据 //接收 传递 过来 的下载 地址 String url = params[0]; //设置 GET请求 HttpGet get = new HttpGet(url); //建立一个 HttpClient 对象 HttpClient client = new DefaultHttpClient(); try { //用 该 对象 把 请求 发送 给 服务端 HttpResponse response = client.execute(get); //判断 服务器端 是否 成功 接收 请求 if(response.getStatusLine().getStatusCode() == 200){ //成功 请求 后 开始 下载 数据 //1)在下载数据 时 如何 更新 进度条呢?//进度条 计算 进度 的 公式 int len = (int)((count/(double) totalLength) * 100); //1 -- 先获取 要下载 文件的 长度 long totalLength = response.getEntity().getContentLength(); //2 -- 设置 进度条 一次 要 更新 多长 //能够 在读一次 要下载的 循环里 设置 进度条 一次 要更新多长 int count = 0; byte[] b = new byte[1024]; int len = 0; BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((len = bis.read(b)) != -1){ //把 数据 写入 内存中 bos.write(b, 0, len); //刷新 一下 bos.flush(); //在这里 设置 进度条 每次 要更新 多长(要和下载内容匹配, //否则数据下完了 进度条 还没 加载完或 进度条加载完了 数据还没下载完) count+= len; //按照 公式 获得 进度条 每次 要 更新的 长度 int progress_len = (int)((count/(double) totalLength) * 100); //利用 方法 publishProgress 跳到 //更新 进度条 的 方法 onProgressUpdate publishProgress(progress_len); } bis.close(); return bos.toByteArray(); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //四、数据 下载 完后 最后 在 执行 onPostExecute //得到 下载的 数据 @Override //接收 返回下载 的数据 protected void onPostExecute(byte[] result) { super.onPostExecute(result); //在这里接收 下载 完 后 返回 来的 结果 if(result != null){ Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length); //设置 下载 图片 的 显示 image.setImageBitmap(bitmap); //最后 关闭 进度条 -- 隐藏进度条 pb.setVisibility(View.GONE); } } }}