Android 异步加载图片-AsyncTask

本文详细介绍了Android异步任务AsyncTask的概念及其内部结构,包括Params、Progress和Result三种泛型类型的作用,并通过实例展示了如何使用AsyncTask进行异步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[plain]  view plain copy print ?
  1. AsyncTask定义了三种泛型类型 Params,Progress和Result。  
  2.     •Params 启动任务执行的输入参数,比如HTTP请求的URL。  
  3.     •Progress 后台任务执行的百分比。  
  4.     •Result 后台执行任务最终返回的结果,比如String。  
[plain]  view plain copy print ?
  1. 一切说明都在代码中......................................................  


Activity

[java]  view plain copy print ?
  1. /* 
  2.  * Android 异步任务AsyncTask 
  3.  * AsyncTask定义了三种泛型类,Params,Progress,Result  
  4.  */  
  5. package rw.ansync;  
  6.   
  7. import android.app.Activity;  
  8. import android.os.Bundle;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.EditText;  
  13. import android.widget.ImageView;  
  14. import android.widget.ProgressBar;  
  15.   
  16. public class AsynaTask_TestActivity extends Activity {  
  17.     /** Called when the activity is first created. */  
  18.     private EditText editText;  
  19.     private Button button;  
  20.     private ProgressBar progressBar;  
  21.     private ImageView imageView;  
  22.     private static final String URL_STRING="http://photocdn.sohu.com/20110927/Img320705637.jpg";  
  23.     @Override  
  24.     public void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.main);  
  27.          
  28.         editText=(EditText) findViewById(R.id.editText1);  
  29.         editText.setText(URL_STRING);  
  30.         button=(Button) findViewById(R.id.button1);  
  31.         progressBar=(ProgressBar) findViewById(R.id.progressBar1);  
  32.         imageView=(ImageView) findViewById(R.id.imageView1);  
  33.         button.setOnClickListener(new ButtonListener());  
  34.     }  
  35.     class ButtonListener implements OnClickListener{  
  36.   
  37.         @Override  
  38.         public void onClick(View v) {  
  39.             // TODO Auto-generated method stub  
  40.                 MyAsynaTask mTask=new MyAsynaTask(imageView, progressBar,button);  
  41.                 mTask.execute(URL_STRING);  
  42.         }  
  43.           
  44.     }  
  45.       
  46.      
  47. }  


MyAsynaTask.java

[java]  view plain copy print ?
  1. package rw.ansync;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.File;  
  5. import java.io.FileOutputStream;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8. import java.net.HttpURLConnection;  
  9. import java.net.URL;  
  10.   
  11.   
  12.   
  13. import android.R.integer;  
  14. import android.graphics.Bitmap;  
  15. import android.graphics.BitmapFactory;  
  16. import android.os.AsyncTask;  
  17. import android.os.IInterface;  
  18. import android.util.Log;  
  19. import android.widget.Button;  
  20. import android.widget.ImageView;  
  21. import android.widget.ProgressBar;  
  22.   
  23.   
  24. public class MyAsynaTask extends AsyncTask<String, Integer, Bitmap>{  
  25.       
  26.     private ImageView imageView;  
  27.     private ProgressBar progressBar;  
  28.     private Button button;  
  29.       
  30.     public MyAsynaTask( ImageView imageView,  
  31.             ProgressBar progressBar,Button button) {  
  32.         super();  
  33.         this.imageView = imageView;  
  34.         this.progressBar = progressBar;  
  35.         this.button=button;  
  36.     }  
  37.   
  38.   
  39.     @Override  
  40.     protected void onPreExecute() {  
  41.         // TODO Auto-generated method stub  
  42.          
  43.         /* 
  44.          * 改方法在执行实际的后台操作时被UI线程调用,可以在该方法中做一些准备工作,比如 
  45.          *  Toast.makeText(context, "准备下载", Toast.LENGTH_LONG).show(); 
  46.          */  
  47.         super.onPreExecute();  
  48.     }  
  49.   
  50.     @Override  
  51.     protected Bitmap doInBackground(String... params) {//输入编变长的可变参数 和UI线程中的Asyna.execute()对应  
  52.         // TODO Auto-generated method stub  
  53.     /* 
  54.      * 该方法在OnpreExecute执行以后马上执行,改方法执行在后台线程当中,负责耗时的计算,可以调用publishProcess方法来实时更新任务进度 
  55.      */  
  56.         Bitmap bitmap=null;  
  57.         try {  
  58.              URL url=new URL(params[0]);  
  59.              Log.i("------------->", url+"");  
  60.              HttpURLConnection connection=(HttpURLConnection) url.openConnection();  
  61.                
  62.              connection.connect();  
  63.              int MAX=connection.getContentLength();  
  64.              progressBar.setMax(MAX);  
  65.               
  66.              InputStream inputStream=connection.getInputStream();  
  67.             
  68.              ByteArrayOutputStream outputStream=new ByteArrayOutputStream();  
  69.              /* 
  70.               * 为了显示进度条,每接受1024字节要求更新一次UI,为了看效果 
  71.               */  
  72.              byte []buf=new byte[1024];  
  73.              int len = 0;  
  74.              int processBarNum=0;  
  75.              while( (len=inputStream.read(buf))!=-1){  
  76.                  outputStream.write(buf, 0, len);  
  77.                  processBarNum+=len;  
  78.                    
  79.                  publishProgress(processBarNum);//通知要更新processBar  
  80.              }  
  81.              bitmap=BitmapFactory.decodeByteArray(outputStream.toByteArray(),0, MAX);  
  82.              inputStream.close();  
  83.                
  84.         } catch (Exception e) {  
  85.             // TODO: handle exception  
  86.         }  
  87.         return bitmap;  
  88.     }  
  89.   
  90.     @Override  
  91.     protected void onProgressUpdate(Integer... values) {  
  92.         // TODO Auto-generated method stub  
  93.         /* 
  94.          * 当publichProcess 呗调用以后,UI线程将调用这个有方法在界面上展示任务的情况,比如一个额进度条。这里是更新进度条 
  95.          */  
  96.         int value=values[0];  
  97.         progressBar.setProgress(value);  
  98.         super.onProgressUpdate(values);  
  99.     }  
  100.   
  101.       
  102.     @Override  
  103.     protected void onPostExecute(Bitmap result) {  
  104.         // TODO Auto-generated method stub  
  105.         /* 
  106.          * 在doInbackground执行完成以后,onPostExecute将被调用,后台的结果将返回给UI线程,将获得图片显示出来 
  107.          */  
  108.         imageView.setImageBitmap(result);  
  109.         super.onPostExecute(result);  
  110.     }  
  111.   
  112.   
  113. }  


 

[html]  view plain copy print ?
  1. 加上权限<uses-permission android:name="android.permission.INTERNET"></uses-permission>  



 


转自:http://blog.youkuaiyun.com/rwyz1314/article/details/6841639

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值