|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
用代码控制view意思他们玩的都是高科技IB都是垃圾很多人也纠结到底用不用IB的确很多时候IB灵活度不行但是不需要灵活度的时候还不用IB那不是装X吗要是没人用苹果还开发IB干嘛早去掉了IB在很多时候节省很多工作量UINavigationController再说说NavigationController刚接触开发的时候不明白View和View之间怎么切换的如今年夜多半的挪动设备已变得愈来愈快,可是它们实在也不算长短常快。假如你想让你的APP既能够接受一些冗杂的事情而又不影响用户体验的话,那末必需把义务并行实行。在Android上,我们利用线程。
端一杯咖啡,然后细心浏览这篇文章。我会给人人先容一下线程的观点,另有在Java中怎样利用线程,在线程中怎样利用Handler等。
假如必要利用异步处置大概并行义务的话,那末你必定会用到线程。
甚么是线程?
线程大概线程实行实质上就是一串命令(也是程序代码),然后我们把它发送给操纵体系实行。
<br>
一样平常来讲,我们的CPU在任什么时候候一个核只能处置一个线程。多核处置器(今朝年夜多半Android设备已都是多核)望文生义,就是能够同时处置多线程(普通地讲就是能够同时处置多件事)。
多核处置与单核多义务处置的本色
下面我说的是一样平常情形,并非一切的形貌都是必定准确的。由于单核也能够用多义务摹拟出多线程。
每一个运转在线程中的义务都能够分化成多条指令,并且这些指令不必同时实行。以是,单核设备能够起首切换到线程1往实行指令1A,然后切换到线程2往实行指令2A,接着前往到线程1再往实行1B、1C、1D,然后持续切换到线程2,实行2B、2C等等,以此类推。
这个线程之间的切换非常敏捷,以致于在单核的设备中也会产生。几近一切的线程都在不异的工夫内举行义务处置。实在,这都是由于速率太快酿成的假象,就像影戏《黑客帝国》里的奸细Brown一样,能够幻化出良多的头和手。
<br>
接上去我们来看一些代码。
Java中心里的线程
在Java中,假如要想做平行义务处置的话,会在Runnable内里实行你的代码。能够承继Thread类,大概完成Runnable接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Version1
publicclassIAmAThreadextendsThread{
publicIAmAThread(){
super("IAmAThread");
}
@Override
publicvoidrun(){
//yourcode(sequenceofinstructions)
}
}
//toexecutethissequenceofinstructionsinaseparatethread.
newIAmAThread().start();
//Version2
publicclassIAmARunnableimplementsRunnable{
@Override
publicvoidrun(){
//yourcode(sequenceofinstructions)
}
}
//toexecutethissequenceofinstructionsinaseparatethread.
IAmARunnablemyRunnable=newIAmARunnable();
newThread(myRunnable).start();
这两个办法基础上是一样的。第一个版本是创立一个Thread类,第二个版本是必要创立一个Runnable对象,然后也必要一个Thread类来挪用它。
第二个版是一般倡议利用的办法。这也是一个很年夜的主题了,凌驾了本文的局限,今后会再做会商。
Android上的线程
不管什么时候启动APP,一切的组件城市运转在一个独自的线程中(默许的)——叫做主线程。这个线程次要用于处置UI的操纵并为视图组件和小部件分发事务等,因而主线程也被称作UI线程。
假如你在UI线程中运转一个耗时操纵,那末UI就会被锁住,直到这个耗时操纵停止。关于用户体验来讲,这长短常糟的!这也就是为何我们要了解Android上的线程机制了。了解这些机制就能够把一些庞大的事情挪动到别的的线程中往实行。假如你在UI线程中运转一个耗时的义务,那末很有大概会产生ANR(使用无呼应),如许用户就会很快地停止失落你的APP。
Android和Java一样,它撑持利用Java内里的Thread类来举行一步义务处置。以是能够轻松地像下面Java的例子一样来利用Android上的线程,不外那仿佛仍是有点坚苦。
为何在Android上利用尺度Java的线程会坚苦呢?
实在平行义务处置没有设想中的那末复杂,你必需在多线程中包管并发,就像巨大的TimBray说的那样:ordinaryhumanscan’tdoconcurrencyatscale(orreallyatall)…
出格关于Android来讲,以下这些功效就略显痴肥:
- 异步关于UI线程来讲是一个次要的PITA(假如你必要在背景线程中向主线程更新界面,那末你就会用到)。
- 假如屏幕偏向大概屏幕设置改动的话,就会呈现一些加倍奇异的征象。由于改动屏幕偏向,会引发Activity重修(以是背景线程就必要往改动被烧毁的Activity的形态了,而假如背景线程不是在UI线程之上的话,那情形会加倍庞大,缘故原由如前提1)。
- 关于线程池来讲,没有默许的处置体例。
- 作废线程操纵必要自界说代码完成。
那末在Android上怎样举行义务并发处置呢?
你大概听过一些Android上一些罕见的名词:
1、Handler
这就是我们明天要会商的具体主题。
2、AsyncTask
利用AsyncTask是在Android上操纵线程最复杂的体例,也是最简单堕落的体例。
3、IntentService
这类体例必要写更多的代码,可是这是把耗时义务挪动到背景的很好的体例,也是我最喜好的体例。配上利用一个EventBus机制的框架如Otto,如许的话完成IntentService就十分复杂了。
4、Loader
关于处置异步义务,另有良多事变必要做,好比从数据库大概内容供应者那边处置一些数据。
5、Service
假如你已经利用过Service的话,你应当晓得这里会有一点误区,个中一个罕见的曲解就是服务是运转在背景线程的。实在不是!看似运转在背景是由于它们不与UI组件联系关系,可是它们(默许)是运转在UI线程上的……以是默许运转在UI线程上,乃至在下面没有UI部件。
<br>
假如想要把服务运转在背景线程中,那末必需自界说一个线程,然后把操纵代码都运转在谁人线程中(与下面提到的办法很相似)。现实上你应当利用IntentService完成,可是这不是本文会商的主题。
Android上的Handler
以下是从AndroiddeveloperdocumentationforHandlers:中摘选的一段话:
>AHandlerallowsyoutosendandprocessMessageandRunnableobjectsassociatedwithathread’sMessageQueue.EachHandlerinstanceisassociatedwithasinglethreadandthatthread’smessagequeue.WhenyoucreateanewHandler,itisboundtothethread/messagequeueofthethreadthatiscreatingit—fromthatpointon,itwilldelivermessagesandrunnablestothatmessagequeueandexecutethemastheycomeoutofthemessagequeue.
<br>
为了更好地懂得这个观点,大概你必要往看看甚么是MessageQueues。
动静行列
在线程里基础都有一个叫做“动静行列”的工具,它卖力线程间通讯。这是一种计划形式,一切把持指令大概内容在线程间传送。
动静行列好像它的名字那样,关于线程来讲,它就是一个指令行列。这里我们还能够做一些更酷的事:
- 准时动静和线程在某个工夫点才实行。
- 必要在另外一个线程中往增加进队举措,而不是在本线程中。
注重:这里说的“动静”和Runnable对象、指令行列的观点是一样的。
回到Android上的Handler……假如你细心浏览的话,能够看到文档是如许说的:
>AHandlerallowsyoutosendandprocessMessageandRunnableobjectsassociatedwithathread’sMessageQueue.
以是Handler可让你给线程行列发动静:
>EachHandlerinstanceisassociatedwithasinglethreadandthatthread’smessagequeue.
一个Handler对象只能和一个线程联系关系:
>WhenyoucreateanewHandler,itisboundtothethread/messagequeueofthethreadthatiscreatingit
以是一个Handler究竟和哪一个线程联系关系呢?就是制造它的线程。
>—fromthatpointon,itwilldelivermessagesandrunnablestothatmessagequeueandexecutethemastheycomeoutofthemessagequeue.、
在我们懂得这些常识后,请持续看……
小贴士:这里有几点大概你还不晓得。每一个线程都和一个Handler类实例绑定,并且能够和其余线程一同运转,互相通讯。
另有一个小倡议(假如用过AsyncTask的话),AsyncTask外部也是利用Handler举行处置的,只是否是运转在UI线程罢了,它会供应一个channel来和UI线程通讯,利用postExecute办法便可完成。
这还挺酷的,那怎样创立Handler呢?
有两种体例:
- 利用默许的机关办法:newHandler()。
- 利用带参的机关办法,参数是一个Runnable对象大概回调对象。
Handler内里有甚么有用的API吗?
请记着:
- Handler只是复杂往动静行列中发送动静罢了(大概利用post体例)
- 它们有更便利的办法能够匡助与UI线程通讯。
假如你如今看看Handler的API,能够分明看到这几个办法:
- post
- postDelayed
- postAtTime
代码示例
这里的代码都是很基本的,不外你能够好悦目看正文。
示例1:利用Handler的“post”办法
<p>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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
publicclassTestActivityextendsActivity{
//...
//allstandardstuff
@Override
publicvoidonCreate(BundlesavedInstanceState){
//...
//allstandardstuff
//werecreatinganewhandlerhere
//andwereintheUIThread(default)
//sothisHandlerisassociatedwiththeUIthread
HandlermHandler=newHandler();
//Iwanttostartdoingsomethingreallylong
//whichmeansIshouldrunthefellainanotherthread.
<p> |
|