• j9九游会登陆--首页直达

    用AsyncTask完成多线程+实例
    • 智网科技
    • ###
    • 分类: 履历之谈
    • 阅读量: 66

    1783214-df73fe30f43e78ae.jpg

    用AsyncTask完成多线程

    在Android使用开辟中,偶然j9九游会必要完成义务的同步。

    Android里的AsyncTask类可以帮j9九游会更好地办理线程同步(异步方法),就像Thread类能做的,不外用法比Thread更复杂。

    AsyncTask算是帮j9九游会做了一层封装吧,使j9九游会可以不必费心那么多,假如阅读AsyncTask的源码就可以理解。

    详细AsyncTask的利用办法,最好参看Google Android的官方文档:

    在你开辟Android使用步伐时,假如有一个耗时义务(通常是一个子线程),而且这个义务挪用了主线程,使用就会抛出闻名的“ANR” (Application Not Responding,"使用无呼应")错误。

    1783214-7051ec6ecac20a43.png

    ANR

    AsyncTask类可以帮j9九游会得救,利用AsyncTask能让j9九游会准确及轻便地利用主线程,即便此时尚有一个异步线程被创立。

    AsyncTask是asynchronous(英语“异步的”的意思)和task(英语“义务”的意思)的缩写,表现“异步义务”。

    它使得耗时义务可以在背景实行,并在前台(UI线程,或称主线程)把实行后果展示出来,不用用到Thread类或Handler类。线程间通讯也随之变得更复杂,优雅。

    主线程(User Interface Thread,UI线程)是在Android里卖力和用户界面举行交互的线程。

    AsyncTask是一个笼统类(abstract class),必需被承继才干实例化。有三个泛型参数,辨别是:

    • Params : 通报给实行的义务的参数,也便是doInBackground办法的参数。

    • Progress : 背景义务实行历程中在主线程展示更新时传入的参数,也便是onProgressUpdate办法的参数。

    • Result : 背景实行的义务前往的后果,也便是onPostExecute办法的参数。

    除此之外,承继AsyncTask类时,一样平常必要完成四个办法。

    固然使用步伐不必要挪用这些办法,这些办法会在义务实行历程中被主动挪用: onPreExecute, doInBackground, onProgressUpdate 和 onPostExecute (此中的doInBackground):

    • onPreExecute : 此办法在主线程中实行,用于初始化义务。

    • doInBackground : 此办法在背景实行,是一个笼统办法,必需要被子类重写。此办法在onPreExecute办法实行完后启动。这个办法中实行的操纵可以是耗时的,并不会壅闭主线程。经过挪用publishProgress办法来在主线程表现背景义务实行的后果更新。

    • onProgressUpdate : 此办法也在主线程中实行,每当publishProgress办法被挪用时,此办法就被实行,此办法只在doInBackground实行历程中才干被挪用。

    • onPostExecute : 在doInBackground办法实行完之后启动的办法,在背景义务完毕后才华用此办法,也在主线程实行。

    实例

    为了更好天文解AsyncTask的利用,j9九游会来完成一个计时器的小使用。

    起首j9九游会创立一个Android项目,就定名为AsyncTaskActivity好了(名字无所谓),修正 res->layout 里的界说主用户界面的 xml 文件(好比是main.xml):

    QQ截图20161205111419.png

    在以上的main.xml文件中,j9九游会次要界说了:

    • 一个EditText,用于输出必要计数的工夫

    • 一个TextView,用于表现计数的变革

    • 一个Button,用于启动计数义务。

    在j9九游会的类AsyncTaskActivity中,j9九游会起首声明三个private变量,对应以上三个元素。

    QQ截图20161205111517.png

    然后创立一个外部类,承继AsyncTask类,定名为“Chronograph”,便是英语“秒表,计时器”的意思。

    41.png

    以上,j9九游会重写了j9九游会必要的四个办法。最初j9九游会再完成j9九游会AsyncTaskActivity类的onCreate办法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
        // 获取三个UI组件
        start = (Button)findViewById(R.id.start);
        chronoText = (TextView)findViewById(R.id.chronoText);
        chronoValue = (EditText)findViewById(R.id.chronoValue);
     
        start.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // 获取EditText里的数值
                int value = Integer.parseInt(String.valueOf(chronoValue.getText()));
                // 验证数值能否大于零
                if (value > 0) {
                    new Chronograph().execute(value);
                }
                else {
                    Toast.makeText(AsyncTaskActivity.this, "请输出一个大于零的整数值 !", Toast.LENGTH_LONG).show();
                }
            }
        });
    }

    假如j9九游会在承继AsyncTask类时,关于三个参数中有不必要的,可以界说为Void范例(留意,与小写的 void 差别),比方:

    QQ截图20161205111645.png

    运转j9九游会的项目,可以失掉如上面三张图所示的后果:

    001.jpg

    按下Start按钮前

    002.jpg

    计数中

    003.jpg

    计数完毕后

    怎样样,AsyncTask不难利用吧~

    这个例子项目我发在我的Github上了,请参看:

    总结

    以后,当有异步义务必要实行时,可以利用AsyncTask类,可以依据本人的必要来定制。

    AsyncTask利用了线程池(Thread Pool)的机制,使得同时实行多个AsyncTask成为大概。但要留意的是,这个线程池的容量是5个线程同时实行,假如凌驾了这个数目,多余的线程必需等候线程池里的线程实行完才干启动。

    利用AsyncTask,最幸亏明白晓得义务会有一个确定和公道的完毕的状况下。不然,照旧利用传统的Thread类为好。

    在doInBackground办法中的耗时操纵最好是能包管在几秒钟之内完成的,不要做分外久的耗时操纵。