• Android之——AsyncTask和Handler对照


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

    AsyncTask和Handler对照

    1 ) AsyncTask实现的原理,和适用的优缺点

    AsyncTask,是android提供的轻量级的异步类,能够直接继承AsyncTask,在类中实现异步操作,提供接口反馈当前异步运行的程度(能够通过接口实现UI进度更新),最后反馈运行的结果给UI主线程.

    使用的长处:

    l  简单,快捷

    l  过程可控

    使用的缺点:

    l  在使用多个异步操作和并须要进行Ui变更时,就变得复杂起来.

    2 )Handler异步实现的原理和适用的优缺点

    在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)执行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。

    使用的长处:

    l  结构清晰,功能定义明白

    l  对于多个后台任务时。简单。清晰

    使用的缺点:

    l  在单个后台异步处理时,显得代码过多。结构过于复杂(相对性)

    AsyncTask介绍
    Android的AsyncTask比Handler更轻量级一些。适用于简单的异步处理。
    首先明白Android之所以有Handler和AsyncTask,都是为了不堵塞主线程(UI线程),且UI的更新仅仅能在主线程中完毕,因此异步处理是不可避免的。

    Android为了减少这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。


    AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型參数,并重载几个方法(至少重载一个)。

    AsyncTask定义了三种泛型类型 Params,Progress和Result。

    • Params 启动任务运行的输入參数,比方HTTP请求的URL。
    • Progress 后台任务运行的百分比。
    • Result 后台运行任务终于返回的结果。比方String。

    使用过AsyncTask 的同学都知道一个异步载入数据最少要重写下面这两个方法:

    • doInBackground(Params…) 后台运行,比較耗时的操作都能够放在这里。注意这里不能直接操作UI。此方法在后台线程运行,完毕任务的主要工作,通常须要较长的时间。在运行过程中能够调用publicProgress(Progress…)来更新任务的进度。

    • onPostExecute(Result)  相当于Handler 处理UI的方式,在这里面能够使用在doInBackground 得到的结果处理操作UI。 此方法在主线程运行。任务运行的结果作为此方法的參数返回

    有必要的话你还得重写下面这三个方法,但不是必须的:

    • onProgressUpdate(Progress…)   能够使用进度条添加用户体验度。 此方法在主线程运行,用于显示任务运行的进度。
    • onPreExecute()        这里是终于用户调用Excute时的接口。当任务运行之前開始调用此方法。能够在这里显示运行进度对话框。
    • onCancelled()             用户调用取消时,要做的操作

    使用AsyncTask类。下面是几条必须遵守的准则:

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

    一个超简单的理解 AsyncTask 的样例:

    main.xml

    ?xml version="1.0" encoding="utf-8"?

    > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView01" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ProgressBar android:id="@+id/progressBar02" android:layout_width="fill_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" /> <Button android:id="@+id/button03" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="更新progressbar" /> </LinearLayout>

    MainActivity.java

        package vic.wong.main;  
          
        import android.app.Activity;  
        import android.os.Bundle;  
        import android.view.View;  
        import android.view.View.OnClickListener;  
        import android.widget.Button;  
        import android.widget.ProgressBar;  
        import android.widget.TextView;  
        /**
         * @author liuyazhuang
         */  
        public class MainActivity extends Activity {  
            private Button button;  
            private ProgressBar progressBar;  
            private TextView textView;  
              
            @Override  
            public void onCreate(Bundle savedInstanceState) {  
                super.onCreate(savedInstanceState);  
                setContentView(R.layout.main);  
                  
                button = (Button)findViewById(R.id.button03);  
                progressBar = (ProgressBar)findViewById(R.id.progressBar02);  
                textView = (TextView)findViewById(R.id.textView01);  
                  
                button.setOnClickListener(new OnClickListener() {  
                      
                    @Override  
                    public void onClick(View v) {  
                        ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView, progressBar);  
                        asyncTask.execute(1000);  
                    }  
                });  
            }  
        }  
    
    

    NetOperator.java

        package vic.wong.main;  
          
        /**
         * 模拟网络环境
         * @author liuyazhuang
         */ 
        public class NetOperator {  
              
            public void operator(){  
                try {  
                    //休眠1秒  
                    Thread.sleep(1000);  
                } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
            }  
          
        }  
    ProgressBarAsyncTask .java
        package vic.wong.main;  
        import android.os.AsyncTask;  
        import android.widget.ProgressBar;  
        import android.widget.TextView;  
          
        /**  
         * 生成该类的对象,并调用execute方法之后  
         * 首先运行的是onProExecute方法  
         * 其次运行doInBackgroup方法  
         * @author liuyazhuang
         */  
        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;  
            }  
          
          
            /**  
             * 这里的Integer參数相应AsyncTask中的第一个參数   
             * 这里的String返回值相应AsyncTask的第三个參数  
             * 该方法并不运行在UI线程其中。主要用于异步操作,全部在该方法中不能对UI其中的空间进行设置和改动  
             * 可是能够调用publishProgress方法触发onProgressUpdate对UI进行操作  
             */  
            @Override  
            protected String doInBackground(Integer... params) {  
                NetOperator netOperator = new NetOperator();  
                int i = 0;  
                for (i = 10; i <= 100; i+=10) {  
                    netOperator.operator();  
                    publishProgress(i);  
                }  
                return i + params[0].intValue() + "";  
            }  
          
          
            /**  
             * 这里的String參数相应AsyncTask中的第三个參数(也就是接收doInBackground的返回值)  
             * 在doInBackground方法运行结束之后在运行,而且运行在UI线程其中 能够对UI空间进行设置  
             */  
            @Override  
            protected void onPostExecute(String result) {  
                textView.setText("异步操作运行结束" + result);  
            }  
          
          
            //该方法运行在UI线程其中,而且运行在UI线程其中 能够对UI空间进行设置  
            @Override  
            protected void onPreExecute() {  
                textView.setText("開始运行异步线程");  
            }  
          
          
            /**  
             * 这里的Intege參数相应AsyncTask中的第二个參数  
             * 在doInBackground方法其中。,每次调用publishProgress方法都会触发onProgressUpdate运行  
             * onProgressUpdate是在UI线程中运行,全部能够对UI空间进行操作  
             */  
            @Override  
            protected void onProgressUpdate(Integer... values) {  
                int vlaue = values[0];  
                progressBar.setProgress(vlaue);  
            }          
          
        }  
    

  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7112846.html
Copyright © 2020-2023  润新知