使用ProgressBar和AsyncTask|使用ProgressBar和AsyncTask 下载图片

2019独角兽企业重金招聘Python工程师标准>>> 使用ProgressBar和AsyncTask|使用ProgressBar和AsyncTask 下载图片
文章图片

使用ProgressBar和AsyncTask 下载图片
功能:一个下载按钮 从网络上下载图片 显示到该页面上
//记得配置联网权限
1、在布局界面布局 activity_main.xml
代码
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

android:id="@+id/progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:visibility="gone"
/>
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

android:id="@+id/bt_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载图片"
android:textSize="30sp"
android:onClick="downLoad"/>

【使用ProgressBar和AsyncTask|使用ProgressBar和AsyncTask 下载图片】

--------------------------------------
2、MainActivity 类
代码
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{
@Override//1、该 工具类 先 执行 onPreExecute
protected void onPreExecute() {
super.onPreExecute();
//显示 进度条
pb.setVisibility(View.VISIBLE);
}
//3、在 该 工具类里 在执行 onProgressUpdate 更新 进度条
@Override //用于 更新进度条的方法
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
//在这里 接收 doInBackground 传递 要更新 进度条 的 多少
pb.setProgress(values[0]);
}
//2、该工具类 然后 执行 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;
}
//4、数据 下载 完后 最后 在 执行 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);
}
}

}
}

转载于:https://my.oschina.net/u/2542711/blog/603549

    推荐阅读