【Android】使用异步任务方法加载网络图片,还有进度条的设置哦~

以前觉得异步任务超级高大上啊,看书上的知识点都有恐惧感,一直没看,想开耗时任务的时候一直用的线程类,现在才发现,异步任务比工作线程简单多了~下面来一个例子,说明下异步任务的用法:

首先我们需要一个Interface:AsyncTask,这是一个接口,不能直接实例化的,所以需要自己创建一个它的子类,MyTask,然后重写父类接口中定义的四个函数。而AsyncTask本身带三个参数:<<span style=”background-color: rgb(247, 247, 247); color: rgb(34, 34, 34);”>Params, Progress, Result>,<>表示泛型,大家应该造哦,我这个小白白都造呢~然后Params参数表示传入这个异步任务待处理的数据,Progress表示进度条的进度值,Result表示处理结果;这里根据实际我将要完成的任务,我将这三个参数的具体类型设为。
下面是具体实现:

/************这个代码从Eclipse复制过来它就没了格式,小白我已经Tab无力了。。微博这个还不能好多行一起Tab。。整洁癖怎么忍。。忍忍吧,老板都忍了,微博这么可爱,干嘛不忍~~***************/

 

  1. package com.example.android_asynctask; 
  2.  
  3. public class MainActivity extends Activity {
  4. private Button button ;
  5. private ImageView imageView;//这个放图片的~
  6. private ProgressDialog dialog;//进度条对话框,认识哦~
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. button (Button)findViewById(R.id.button1);
  13. imageView (ImageView)findViewById(R.id.imageView1);
  14. //对话框参数
  15. dialog new ProgressDialog(this);
  16. dialog.setTitle(“提示”);
  17. dialog.setMessage(“正在下载图片”);
  18. dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  19. //图片地址哦,是一件衣服嘿嘿~
  20. final String IMAGE_PATH “http://a.vpimg1.com/upload/merchandise/201408/2014082111114539470.jpg”;
  21. button.setOnClickListener(new View.OnClickListener() {
  22. @Override
  23. public void onClick(View arg0) {
  24. // TODO Auto-generated method stub
  25. new MyTask().execute(IMAGE_PATH);
  26. }
  27. });
  28. }
  29. public class MyTask extends AsyncTask<</span>String, Integer, byte[]> {
  30.  
  31. //最后被执行, 更新UI,不一定需要的
  32. @Override
  33. protected void onPostExecute(byte[] result) {
  34. super.onPostExecute(result);
  35. Bitmap bitmap BitmapFactory.decodeByteArray(result,0, result.length);
  36. imageView.setImageBitmap(bitmap);
  37. dialog.dismiss();
  38. }
  39.  
  40.  //这四个函数执行还是有顺序的,这是第一个被执行的,pre嘛,这里就是显示了一下进度条的对话框
  41. @Override
  42. protected void onPreExecute() {
  43. // 该函数用来显示提示框,如果没有需要,则不需要调用
  44. super.onPreExecute();
  45. dialog.show();
  46. }
  47.  
  48.  //第三个被执行,更新进度条
  49. @Override
  50. protected void onProgressUpdate(Integer… values) {
  51. // 更新进度条
  52. super.onProgressUpdate(values);
  53. dialog.setProgress(values[0]);
  54. }
  55.  
  56. //这是第二个,拿到待处理参数,这里就是String类型的Image地址啦
  57. @Override
  58. protected byte[] doInBackground(String… params) {
  59. // Http这个怎么个处理过程,我还母鸡:-(。。
  60. HttpClient httpClient new DefaultHttpClient();
  61. HttpGet httpGet new HttpGet(params[0]);
  62. byte[] result null;
  63. // 传输流
  64. InputStream inputStream =null;
  65. ByteArrayOutputStream outputStream new ByteArrayOutputStream();
  66. try {
  67. HttpResponse httpResponse httpClient.execute(httpGet);
  68. long file_length httpResponse.getEntity().getContentLength();//文件总长度
  69. int total_length 0;
  70. byte[] data new byte[1024];
  71. int len 0;
  72.  
  73. if(httpResponse.getStatusLine().getStatusCode()==200){
  74. // result EntityUtils.toByteArray(httpResponse.getEntity());
  75.  
  76. inputStream httpResponse.getEntity().getContent();
  77. while((len inputStream.read(data))!=-1){
  78. total_length += len;
  79. int progress_value (int)(total_length/(float)file_length*100);
  80. publishProgress(progress_value);
  81. outputStream.write(data,0,len);
  82. }
  83. }
  84. result outputStream.toByteArray();
  85.  
  86. catch (Exception e) {
  87. e.printStackTrace();
  88. }finally{
  89. httpClient.getConnectionManager().shutdown();
  90. }
  91. return result;
  92. }

嗯,自己写博客给自己看~小白成长日记。。不知道会成长成啥样。。

此条目发表在Android技术分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注