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办法中的耗时操纵最好是能包管在几秒钟之内完成的,不要做分外久的耗时操纵。