Android_AsyncTask

AsyncTask


概念

AsyncTask是android提供的轻量级异步类,就是一个封装过的后台任务类。它提供了接口返回当前异步操作的执行进度和执行结果。使用时直接将需要进行异步操作的类直接继承AsyncTask即可。

参数

AsyncTask定义了三种泛型类型
Params启动任务时执行的输入参数
Progress任务执行的进度(百分比)
Result返回的执行结果

需要重写的方法

必须重写的方法
doInBackground(Params…)需要执行的耗时的线程操作
onPostExecute(Result)此方法在主线程中执行,用来处理返回的结果
可能重写的方法
onProgressUpdate(Progress…)此方法在主线程执行,用来显示任务执行的进度。
onPreExecute()这是用户调用Excute时的接口,当任务执行开始之前调用此方法,可以在这里显示提示信息。
onCancelled()用户调用取消时,要做的操作

代码示例

xml比较简略,不贴出了,其中包括TextView,ProgressBar,Button各一个。
MainActivity.class

public class MainActivity extends Activity {  
    private Button mButton;  
    private ProgressBar mProgressBar;  
    private TextView mTextView;  

    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        //初始化  
        mButton= (Button)findViewById(R.id.btn_start);  
        mProgressBar= (ProgressBar)findViewById(R.id.pb_log);  
        mTextView= (TextView)findViewById(R.id.tv_log);  
         //绑定mButton单击事件
        mButton.setOnClickListener(new OnClickListener() {  

            @Override  
            public void onClick(View v) {  
                //AsyncTask必须在UI线程中声明
                TestAsyncTask mAsyncTask = new TestAsyncTask(textView, progressBar); 
                //开始执行异步线程--->调用了onPreExecute()
                mAsyncTask.execute(1000);  
            }  
        });  
    }  
}  

TestAsyncTask.class

public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {  

    private TextView textView;  
    private ProgressBar progressBar;  


    public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {  
        super();  
        this.textView = textView;  
        this.progressBar = progressBar;  
    }  


    /**  
     * 该方法并不运行在UI线程当中,主要用于异步操作
     * 该方法中不能对UI当中的空间进行设置和修改    
     */  
    @Override  
    protected String doInBackground(Integer... params) {  
        int i = 0;  
        for (i = 10; i <= 100; i+=10) {  
            try {  
            Thread.sleep(500);  
        } catch (InterruptedException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
            //触发onProgressUpdate()更新UI中的ProgressBar
            publishProgress(i);  
        }  
        return i + params[0].intValue() + "";  
    }  


    /**  
     * result接收doInBackground的返回值)  
     * 此方法在doInBackground方法执行结束之后运行
     * 此方法中可以执行UI操作
     */  
    @Override  
    protected void onPostExecute(String result) {  
        textView.setText("End" + result);  
    }  

    @Override  
    protected void onPreExecute() {  
        textView.setText("Start");  
    }  

    @Override  
    protected void onProgressUpdate(Integer... values) {  
        int vlaue = values[0];  
        progressBar.setProgress(vlaue);  
    }  
}  

注意

  1. Task的实例必须在UI thread中创建;
  2. execute方法必须在UI thread中调用;
  3. 不要手动的调用onPreExecute(), onPostExecute(Result)
  4. doInBackground(Params…), onProgressUpdate(Progress…)这几个方法;
  5. 该task只能被执行一次,否则多次调用时将会出现异常;

AsyncTask & Handler

它们存在的意义是一样的:Handler和AsyncTask,都是为了不阻塞UI线程才存在。为了降低开发难度,android提供了AsyncTask后台任务类。

AysncTask
优点缺点
操作简单AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果此时向线程提交任务,将会抛出RejectedExecutionException。–>由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。
编写快捷在使用多个异步操作并需要进行Ui变更时,就变得复杂起来.
handler
优点缺点
结构清晰,功能定义明确在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)
多个后台任务时,简单,清晰

转载请注明出处:http://blog.csdn.net/zifeng1203s/article/details/44201889

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值