android开发异步加载网络数据AsyncTask的使用

一、异步任务加载网络数据:

在android中提供了一个异步任务的类AsyncTask,简单来说,这个类中的任务是运行在后台线程中的,并可以将结果放到UI线程中进行处理,它定义了三种 泛型,分别是Params、Progress和Result,分别表示请求的参数、任务的进度和获得的结果数据。


1、使用原因:

1)其中使用了线程池技术,而且其中的方法很容易实现调用。

2)可以调用相关的方法,在开启子线程前和后,进行界面的更新。

3)一旦任务多了,不用每次都new新的线程,可以直接使用。


2、执行的顺序:

onPreExecute()【执行前开启】---》doInBackground(Object... params)---》onProgressUpdate(Object... values)---》onPostExecut e(Object result)

3、执行过程:

当一个异步任务开启后,执行过程如下:

1)onPreExecute();

这个方法是执行在主线程中的。这不操作是用于准备好任务的,作为任务加载的准备工作。建议在这个方法中弹出一个对话框。

   2)doInBackground(Object... params);

这个方法是执行在子线程中的。在onPreExecute();方法执行完后会立即执行这个方法在方法中可以执行耗时的操作。需要将请求的 参数传递进来,发送给服务器,并将或取到的数据返回,数据会传给最后一步中;这些值都将被放到主线程中,也可以不断地传递给下一步的 onProgressUpdate();中进行更新。可以通过不断地调用publishProgress();将数据(或进度)不断传递给onProgressUpdate();方法,进行不 断更新界面。

3)onProgressUpdate(Object... values);

这个方法是执行在主线程中的。publishProgress();在doInBackground(Object... params);中被调用后,才开始执行的这个方法, 他在何时被开启的是不确定的,在执行这个方法的过程中,doInBackground(Object... params);方法是仍在执行的即子线程还在执行着。

4)onPostExecute(Object result);

这个方法是执行在主线程中的。当后台的子线程执行完毕后才调用的这个方法。doInBackground(Object... params);返回的结果会 作为参数被传递过来。可以在这个方法中进行数据处理界面更新的操作。

 5)execute();

    最后创建 AsyncTask的自定义类,开启异步任务。asyncTask.execute(params);

4、实现原理:

1)线程池的创建:

在创建了AsyncTask的时候,会默认创建一个线程池ThreadPoolExecutor,并默认创建出5个线程放入到线程池中,最多可放128个线程;且这个线程池是公共的 唯一一份儿

2)任务的执行:

在execute();中,会执行run方法,当执行完run方法后,会调用scheduleNext();不断的从双端队列中轮询,获取下一个任务并据需放到一个子线程中执行,知道异 步任务执行完成。

3)消息的处理:

在执行完onPreExecute()方法之后执行了doInBackground(Object... params);方法,然后就不断的发送请求获取数据;在这个AsyncTask中 维护了一个InternalHandler的类,这个类是继承Handler的,获取的数据是通过Handler进行处理和发送的。在q其handlerMessage();方法中, 将消息传给onProgressUpdate(Object... values);进行进度的更新,也就可以将结果发送到主线程中进行界面的更新了。

5、需要注意的是:

1)这个AsyncTask类必须有子类进行调用

2)虽然是放在子线程中执行的操作,但是不建议做特别耗时的操作,如果操作过于耗时建议使用线程池ThreadPoolExecutor和FutureTask



贴出代码:


NetOperator.java

  1. package vic.wong.main;  
  2.   
  3.   
  4. //模拟网络环境  
  5. public class NetOperator {  
  6.       
  7.     public void operator(){  
  8.         try {  
  9.             //休眠1秒  
  10.             Thread.sleep(1000);  
  11.         } catch (InterruptedException e) {  
  12.             // TODO Auto-generated catch block  
  13.             e.printStackTrace();  
  14.         }  
  15.     }  
  16.   
  17. }  

ProgressBarAsyncTask .java 

  1. package vic.wong.main;  
  2. import android.os.AsyncTask;  
  3. import android.widget.ProgressBar;  
  4. import android.widget.TextView;  
  5.   
  6. /**  
  7.  * 生成该类的对象,并调用execute方法之后  
  8.  * 首先执行的是onProExecute方法  
  9.  * 其次执行doInBackgroup方法  
  10.  *  
  11.  */  
  12. public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {  
  13.   
  14.     private TextView textView;  
  15.     private ProgressBar progressBar;  
  16.       
  17.       
  18.     public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {  
  19.         super();  
  20.         this.textView = textView;  
  21.         this.progressBar = progressBar;  
  22.     }  
  23.   
  24.   
  25.     /**  
  26.      * 这里的Integer参数对应AsyncTask中的第一个参数   
  27.      * 这里的String返回值对应AsyncTask的第三个参数  
  28.      * 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改  
  29.      * 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作  
  30.      */  
  31.     @Override  
  32.     protected String doInBackground(Integer... params) {  
  33.         NetOperator netOperator = new NetOperator();  
  34.         int i = 0;  
  35.         for (i = 10; i <= 100; i+=10) {  
  36.             netOperator.operator();  
  37.             publishProgress(i);  
  38.         }  
  39.         return i + params[0].intValue() + "";  
  40.     }  
  41.   
  42.   
  43.     /**  
  44.      * 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)  
  45.      * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置  
  46.      */  
  47.     @Override  
  48.     protected void onPostExecute(String result) {  
  49.         textView.setText("异步操作执行结束" + result);  
  50.     }  
  51.   
  52.   
  53.     //该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置  
  54.     @Override  
  55.     protected void onPreExecute() {  
  56.         textView.setText("开始执行异步线程");  
  57.     }  
  58.   
  59.   
  60.     /**  
  61.      * 这里的Intege参数对应AsyncTask中的第二个参数  
  62.      * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行  
  63.      * onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作  
  64.      */  
  65.     @Override  
  66.     protected void onProgressUpdate(Integer... values) {  
  67.         int vlaue = values[0];  
  68.         progressBar.setProgress(vlaue);  
  69.     }  
  70.   
  71.       
  72.       
  73.       
  74.   
  75. }  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值