当前位置:操作系统 > 安卓/Android >>

android开发之AsyncTask的用法

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。

Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。

为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。

先来看看AsyncTask的定义:


[java]
public abstract class AsyncTask<Params, Progress, Result> {   

public abstract class AsyncTask<Params, Progress, Result> { 
三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。

一个异步任务的执行一般包括以下几个步骤:

1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。

2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。

3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。

4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。

5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。

在使用的时候,有几点需要格外注意:

1.异步任务的实例必须在UI线程中创建。

2.execute(Params... params)方法必须在UI线程中调用。

3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。

4.不能在doInBackground(Params... params)中更改UI组件的信息。

5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。

 为了对该方法有更为深入的认识,下面以一个例子来说明。

该例子要实现的是进度条倒计时的功能。时长30s,随着时间的减少,进度条逐渐缩短,同时文本框中的剩余时间也相对应减少。


[java]
import android.os.AsyncTask; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
 
class TestAsyncTask extends AsyncTask<String, Integer, String>   
{   
    FullscreenActivity activity;   
    TextView textView; 
    ProgressBar bar; 
 
    public TestAsyncTask(FullscreenActivity activity, TextView textView, ProgressBar bar ) { 
        this.activity = activity; 
        this.textView = textView; 
        this.bar = bar; 
    } 
    //TestAsyncTask被后台线程执行后,被UI线程被调用,一般用于初始化界面控件,如进度条    
    @Override  
    protected void onPreExecute() {   
        // TODO Auto-generated method stub    
        super.onPreExecute();   
    }   
 
    //doInBackground执行完后由UI线程调用,用于更新界面操作    
    @Override  
    protected void onPostExecute(String result) {   
        // TODO Auto-generated method stub    
         
         
        //textView.setText(result);    
        super.onPostExecute(result);   
    }   
 
    //在PreExcute执行后被启动AysncTask的后台线程调用,将结果返回给UI线程    
    @Override  
    protected String doInBackground(String... params) {   
        // TODO Auto-generated method stub    
        bar.setMax(300); 
        int i = 30; 
        while(true) 
        { 
            publishProgress((int)i); 
            if(i == 0 ) break; 
            try { 
                Thread.sleep(1000); 
            } catch (InterruptedException e) { 
                // TODO Auto-generated catch block  
                e.printStackTrace(); 
            } 
            i--; 
             
        } 
        return null;   
    } 
    @Override 
    protected void onProgressUpdate(Integer... values) { 
        // TODO Auto-generated method stub  
        bar.setProgress(values[0]*10);   
        textView.setText("" + values[0] + " s");   
         
        super.onProgressUpdate(values); 
    }   
     
        
}   

import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;

class TestAsyncTask extends AsyncTask<String, Integer, String> 

 FullscreenActivity activity; 
 TextView textView;
 ProgressBar bar;

 public TestAsyncTask(FullscreenActivity activity, TextView textView, ProgressBar bar ) {
  this.activity = activity;
  this.textView = textView;
  this.bar = bar;
 }
    //TestAsyncTask被后台线程执行后,被UI线程被调用,一般用于初始化界面控件,如进度条 
    @Override
    protected void onPreExecute() { 
        // TODO Auto-generated method stub 
        super.onPreExecute(); 
    } 

    //doInBackg

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,