异步任务(AsyncTask)

一、解决新线程无法更新UI组建问题的方案 


为了解决新线程不能更新UI组建的问题,Andorid提供了如下几种解决方案: 


1.使用Handler实现线程之间的通信。 

mHandler = new Handler() {
   @Override
   public void handleMessage(Message msg) {
        //操作界面
       myText.setText( 来自网络的信息);
      super.handleMessage(msg);
   }
  };
public class MyThread extends Thread {
     public void run() {
            // 耗时操作
            loadNetWork();
            Message msg = new Message();
            mHandler.sendMessage(msg);//向Handler发送消息,
      }
 }


2.Activity.runOnUiThread(Runnable)。 

public void onClick( View v ) {
        new Thread( new Runnable() {
                public void run() {
                       // 耗时操作
                          loadNetWork();
                         Activity.runOnUiThread.( new Runnable() {
                                  myText.setText( 来自网络的信息);
                          });
                 }
        }).start();
}

3.View.post(Runnable)。 

public void onClick( View v ) {
        new Thread( new Runnable() {
                public void run() {
                       // 耗时操作
                          loadNetWork();
                          myText.post( new Runnable() {
myText.setText( 来自网络的信息);
                          });
                 }
        }).start();
}

4.View.postDelayed(Runnable)。


 二、AsyncTask抽象类 
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数: 
Params:启动任务执行的输入参数的类型。 
Progress:后台任务完成进度值的类型。 
Result:后台执行任务完成后返回结果的类型。


//UI线程中执行
 new DownloadImageTask().execute( "www.91dota.com" );

private class LoadTask extends AsyncTask {   
    protected String doInBackground( String... url ) {   
         return loadDataFormNetwork( url[0] );//后台耗时操作   
    }   
  
    protected void onPostExecute( String result ) {   
          myText.setText( result ); //得到来自网络的信息刷新页面    
  
   }  

 
 
三、AsyncTask的特点 
更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可。 
 
四、使用AsyncTask的步骤 
 1.创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为void。 
  2.根据需要,实现AsyncTask的如下方法: 
       doInBackground(Params …):后台线程将要完成的任务,可以调用publishProgress(Progress... values)方法更新任务执行进度。 
       onProgressUpdate(Progress... values):在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法。 
       onPreExecute():执行后台耗时操作前被调用,通常用户完成一些初始化操作,比如在界面上显示进度条。 
       onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法。 
  3.调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务。  


五、使用AsyncTask时必须遵守的规则 

必须在UI线程中创建AsyncTask的实例。 
必须在UI线程中调用AsyncTask的execute()方法。 
AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onProgressUpdate(Progress... values)方法,不应该由程序员代码调用,而是由Android系统负责调用。 
每个AsyncTask只能被执行一次,多次调用将会引发异常。 


帮助理解:

http://blog.csdn.net/zkdemon/article/details/6914161

http://blog.csdn.net/fenghome/article/details/5675421

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值