•  AsyncTask实现的原理,和适用的优缺点

    AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

  以下部分是学习代码:

    UI:

 <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="750dp"
android:maxHeight="400dp"
android:adjustViewBounds="true"
/> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="68dp"
android:text="下载网络图片" /> </RelativeLayout>

    Activity:

    

 package com.example.android_asynctask_downloadimage;

 import java.io.ByteArrayOutputStream;
import java.io.IOException;
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.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; /**
* @author xiaowu
* NOTE:异步任务AsyncTask
*/
public class MainActivity extends Activity {
private Button button ;
private Button button2 ;
private ImageView imageView ;
private final String IMAGE_PATH ="http://e.hiphotos.baidu.com/zhidao/pic/item/c2fdfc039245d68858f1c69fa5c27d1ed21b241d.jpg";
private ProgressDialog progressDialog ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) this.findViewById(R.id.button1);
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("提示");
// progressDialog.setCancelable(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("正在下载图片,请耐心等待..."); imageView = (ImageView) this.findViewById(R.id.imageView1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new MyTask().execute(IMAGE_PATH);
}
}); }
/**
* @author xiaowu
* 异步任务AsyncTask,执行网络下载图片
* AsyncTask<String, Integer, byte[]> 如果异步任务不需要参数传递,可以直接将参数设置为Void
* params:
* String:(网络图片的)路径
* Integer: 进度单位,刻度类型
* byte[]:异步任务执行的返回结果
* 异步任务有4个步骤:
* 1、onPreExecute(); 在异步任务执行之前执行,用来构建一个异步任务,如显示一个进度条给用户看
* 2、doInBackground(Params...); 异步任务必须实现的方法,具体的异步任务所做的事情
* 3、onProgressUpdate(Progress...);
* 4、onPostExecute(Result);
*/
public class MyTask extends AsyncTask<String, Integer, byte[]>{
//在异步任务执行之前执行,用来构建一个异步任务,如显示一个进度条给用户看
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
//展示进度条对话框
progressDialog.show();
}
//异步任务必须实现的方法,具体的异步任务所做的事情。并将结果返回值最后一个步骤。
@Override
protected byte[] doInBackground(String... params) {
// TODO Auto-generated method stub
//
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
InputStream inputStream = null;
byte[] result = null; //图片的所有内容
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
//发起get请求,并获取反馈
HttpResponse httpResponse = httpClient.execute(httpGet);
long file_length = httpResponse.getEntity().getContentLength(); //文件实际总长度
int total_length = 0 ;
byte[] data = new byte[1024];
int len = 0 ;
if (httpResponse.getStatusLine().getStatusCode()==200) {
// result = EntityUtils.toByteArray(httpResponse.getEntity());
//读取返回内容(内容是以流的形式返回)
inputStream = httpResponse.getEntity().getContent();
//更新进度条并读取数据
while ((len = inputStream.read(data)) != -1) {
total_length +=len ;
int progress_value = (int) ((total_length/ (float) file_length)*100);
//通过publishProgress()方法发布进度值到onProgressUpdate
publishProgress(progress_value); //发布刻度单位
byteArrayOutputStream.write(data, 0, len);
}
}
result = byteArrayOutputStream.toByteArray();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//关连接
httpClient.getConnectionManager().shutdown();
} return result;
}
//更新UI展示信息:如进度条的变动
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
}
//将doInBackground的执行结果展示到UI
@Override
protected void onPostExecute(byte[] result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
imageView.setImageBitmap(bitmap);
progressDialog.dismiss();
} }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

最新文章

  1. SQL Server 数据加密功能解析
  2. iOS APP可执行文件的组成
  3. z-index 详解
  4. 提取数据库字段里面的值,并改变+图片懒加载,jquery延迟加载
  5. ps aux和ps ef的区别
  6. tableView尾部多处一部分空白高度
  7. PowerShell入门(一):PowerShell能干什么?
  8. jQuery的9中构造函数
  9. 微信小程序结合后台数据管理实现商品数据的动态展示、维护
  10. Java 常用List集合使用场景分析
  11. codeforces 842D Vitya and Strange Lesson
  12. 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165319
  13. MT【315】勾股数
  14. redis 指令文档
  15. Hbase学习04
  16. BZOJ 4282(慎二的随机数列
  17. 使用日志服务进行Kubernetes日志采集
  18. mvc返回多个结果集,返回多个视图
  19. NOIP2013 花匠解题报告
  20. Gym 100463A Crossings (树状数组 逆序对)

热门文章

  1. bzoj4545
  2. Python命令模块argparse学习笔记(四)
  3. shell入门-awk-3
  4. unreal3启动地图设置
  5. 2、Spark基本工作原理与RDD
  6. Entity Framework Code-First(11):Configure One-to-One
  7. 4.Windows应急响应:勒索病毒
  8. PHP-CGI远程任意代码执行漏洞(CVE-2012-1823)修复方案
  9. 原生 Ajax 封装 和 Axios 二次 封装
  10. Visual Studio 2017&amp;C#打包应用程序详细教程,重写安装类获取安装路径