多年前的一个小例子,只做技术练习。
1.啥是异步?
2.为什么要异步下载图片?
MainActivity:
public class MainActivity extends Activity{
private Button btn;
private ImageView iv;
private ProgressBar bar;
private String path = "http://118.244.212.82:9092/Images/20140509075810c679d.png";
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(R.layout.activity_main);
btn = (Button)findViewById(R.id.button);
iv = (ImageView)findViewById(R.id.imageView);
bar = (ProgressBar)findViewById(R.id.progressBar);
bar.setMax(100);
bar.setProgress(0);
btn.setOnClickListener(new OnClickListener(){
iv.setImageResource(R.drawable.ic_launcher);
// 创建异步任务对象
ImageService task = new ImageService(btn, bar, iv);
// 启动异步任务
task.execute(path);
})
}
}
ImageService类:
/**
* 定义异步下载任务--下载图片
* 1.创建一个类即成AsyncTask,根据实际的业务确定三个泛型类型
* Params:耗时操作需要传递的参数类型String
* Progress:UI组件在耗时操作过程中需要的参数类型Integer,如果不需要更新UI组件,不需要声明
* Result:耗时操作返回的结果类型
* 2.重写doInBackground方法
* 3.将需要更新的UI组件对象封装到异步任务中。
*/
public class ImageService extend AsyncTask<String, Integer, Bitmap>{
private Button btn;
private ProgressBar bar;
private ImageView iv;
public ImageService(Button btn, ProgressBar bar, ImageView iv){
super();
this.btn = btn;
this.bar = bar;
this.iv = iv;
}
/**
* 这个方法用于处理耗时操作,工作在子线程,异步任务启动时执行
*/
@Override
protected Bitmap doInBackground(String... arg0){
Bitmap bitmap = null;
// 可变参数提取每一个参数的跟访问数组元素一样
// 可变参数就是可以传递那个相同数据类型的参数??
String url = arg0[0];
HttpURLConnection con = null;
InputStream in = null;
try {
con = (HttpURLConnection) new URL(url).openConnection();
// 5秒延迟
con.setReadTimeout(5000);
con.setDoInput(true);
if(con.getResponseCode() == 200){
in = con.getInputStream();
bitmap = BitmapFactory.decodeStream(in);
}
// 模拟一个耗时操作的时间
for(int i = 0; I <= 10; i++){
Thread.sleep(1000);
// 更新UI组件在异步任务过程中,调用此方法会调用onProgressUpdate方法。
publishProgress(i*10);
}
} catch (MalformedURLException e){
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} catch (InterruptedException e){
e.printStackTrace();
}
}
return bitmap;
}
/**
* 工作在UI线程,在执行完doInBackground后执行此方法,同时将返回结果传递给此方法
* 可以在这个方法中处理跟Handler一样的业务--更新UI组件
*/
@Override
protected void onPostExecute(Bitmap result){
btn.setText("下载完毕");
// 设置图片
iv.setImageBitmap(result);
}
/**
* 工作在UI主线程的,在执行doInBackgroud方法之前执行,用于做耗时操作之前提示在UI界面提示用户
* 更新UI组件
*/
@Override
protected void onPreExecute() {
btn.setText("正在下载...");
}
/**
* 工作的UI主线程,在doInBackgroud方法执行过程中通过
* publishProgress(progress)与此方法通信
*/
@Override
protected void onProgressUpdate(Integer... values) {
bar.setProgress(values[0]);//更新进度条的进度值
}
}