仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1865|回复: 12
打印 上一主题 下一主题

[学习教程] IOS教程之Android线程和Handler基本进门仓酷云

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-18 11:26:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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>
沙发
 楼主| 发表于 2015-1-18 22:25:35 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
金色的骷髅 该用户已被删除
板凳
发表于 2015-1-21 10:43:34 来自手机 | 只看该作者
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
分手快乐 该用户已被删除
地板
发表于 2015-1-30 15:46:15 | 只看该作者
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
老尸 该用户已被删除
5#
发表于 2015-1-30 17:02:46 | 只看该作者
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
若天明 该用户已被删除
6#
发表于 2015-2-6 00:26:13 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
简单生活 该用户已被删除
7#
发表于 2015-2-11 11:09:26 | 只看该作者
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
只想知道 该用户已被删除
8#
发表于 2015-2-20 14:30:50 | 只看该作者
因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。
再现理想 该用户已被删除
9#
发表于 2015-3-6 18:25:46 | 只看该作者
其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。
柔情似水 该用户已被删除
10#
发表于 2015-3-6 21:09:07 | 只看该作者
其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。
精灵巫婆 该用户已被删除
11#
发表于 2015-3-13 09:08:56 | 只看该作者
iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。
爱飞 该用户已被删除
12#
发表于 2015-3-13 09:08:56 | 只看该作者
看完这个你就可以有多种选择来踏入做应用的阶段
第二个灵魂 该用户已被删除
13#
发表于 2015-3-20 17:46:48 | 只看该作者
在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表