分类目录归档:0基础编程

从锦囊妙计想到的03–线程介绍

前面 从锦囊妙计想到的01   从锦囊妙计想到的02

介绍了 计算机就是一个执行任务的“人”, 这些人物就是一个个的锦囊(指令)。 这些各种各样的指令混合到一起后形成程序, 为了清晰明确的表明程序绘制了程序的流程图。

本文讨论一下, 什么情况下 曹军会获胜, 什么情况下曹军会失败(这里仅仅是 为说明程序上的一些事情而 杜撰的一下结论和事情, 千万别当真!!)。

首先, 若是诸葛亮亲自指挥大军, 对抗曹军, 那么在什么情况下, 都是曹军失败。

其次, 若是关羽指挥 大军对抗曹军,   需要看曹军是什么人员领军, 若是曹操亲自领军, 估计关羽获胜几率非常低。 若是其他大将领军, 关羽获胜的可能性很大

 因此可以看到, 战斗的最终结果只有到这些因素都最终确定了 才能最终确定。 那么什么时候才能真正确定这些结果呢??

我们可以通过下面图形思考一下!

j9

从上面的图中, 可以了解到, 有两个重要的时间点,

第一个时间点, 是获知曹军要来, 然后商讨行动计划的时刻, 在这个时刻有大量的 不确定的 情况, 因此行动计划必须  具有能根据不同情况而变化的能力, 这个就是那个判断的分支。

第二个时间点, 是曹军真正来临了, 两军在城外对战了, 这个时候, 一切不确定因素都确定了, 因此这个时候程序一定沿着一个情况(一个分支)进行下去。

可以在进一步整理一下, 就如下图, 能更清晰些。

j9-2

 

通过上面 两幅图, 要重点说明的是:

  • 程序的编写是    想象中的事情....  因此一定存在各种各样的不确定的地方, 因此 要把这些都考虑进去(因此自然会有很多不同情况的分支供将来选择), 这样在 实际执行时, 会根据当时的具体情况执行特定的功能。
  • 程序的执行是   实际中(现实中)的事情, 这个时刻 全部的  不确定因素一定都确定了, 否则程序没办法在各个分支中寻找一个,然后执行。

下我们看另外一幅图

j9-3

 

这幅图是, 程序实际执行过程中的一个 具体的工作流程。

这个图可以进一步优化为:

j

其实, 无论多么复杂的  一个程序流程(或者程序), 最后都 可以抽象出一个, 上面简化的执行路线图。 通过上图可以知道

  • 程序是一个执行路线, 没有分支(具体的,时间的执行时)
  • 执行过程是 从上到下,一个路线向前进行, 没有后退
  • 程序执行路线 是有开始 和结束的, 结束后就不在进行了!

这条具体的执行路线, 通常称为线程(thread)。  通俗一点的解释, 就是一条沿着一个路线执行的程序, 通常可以成为线程(这个不是准确的叫法, 这里为了小朋友能理解, 尽量采用了通俗的近似, 随着时间的推移, 程序理解的增多, 可以慢慢理解这些概念)。

下面是对程序的另外一个理解方式

jjj

 

从上图,

  • 一个编写好的程序(就是一堆锦囊), 是一个程序, 这个时候程序还没开始执行。
  • 把编写好的程序拿来执行, 在进行执行过程中的程序 是一个进程
  • 在一个进程中(一个进行中的一堆锦囊), 必然有一个执行路线,这个路线是线程。
  • 一个进程中必要有一个线程, 但是也可以有若干条其他执行路线, 后面我们会讨论的
  • 另外,一个程序可以被多次执行, 也可以被同时多次执行, 可见通过一个程序可以创建若干个进程的。

 

本文重点:

1. 编程的时间是  程序执行前, 因此都是预期的(就是不能确定将来真正执行时, 到底要准确执行那个分支或者过程等等),不是真正的!

2. 程序在执行时,一切没有确定的事情都确定了, 因此走那个分支, 那个循环如何走, 就确定了

3. 程序执行是需要一定时间的, 因此程序在执行进行中,  叫做一个进程

4. 线程是 进程中,  一系列锦囊操作的过程,这些过程可以被一条线串起来,并且在执行过程中不确定的事情都确定了, 这个执行路线是可以度量的, 因此把这些 可以用线串连起来的 过程叫做线程!

 

相关文章

计算机介绍                                  从锦囊妙计想到的01

流程图(分支结构)介绍          从锦囊妙计想到的02

线程介绍                                     从锦囊妙计想到的03

循环结构介绍                             从锦囊妙计想到的05

流程线程总结                             从锦囊妙计想到的06

cpu和线程定义、开始               从锦囊妙计想到的07

分布式计算                                  从锦囊妙计想到的08

分布式中事件和计数                 从锦囊妙计想到的09

内容总结                                     从锦囊妙计想到的10

数据类型,变量简介                从锦囊妙计想到的11

函数和参数                                从锦囊妙计想到的12

用户交互与数据输入输出       从锦囊妙计想到的13

人机交互界面                            从锦囊妙计想到的15 

过程与对象                                从锦囊妙计想到的16

同步和异步                                从锦囊妙计想到的17

顺序打印                                    从锦囊妙计想到的18

数据输入输出                            从锦囊妙计想到的19

屏幕坐标和打印                        从锦囊妙计想到的20

java函数控制输出                     从锦囊妙计想到的21

逐步细化解决复杂问题           从锦囊妙计想到的22

java入门                                    从锦囊妙计想到的23

java复杂过程分析                   从锦囊妙计想到的25

中间辅助功能解决问题          从锦囊妙计想到的26

叠加操作输出复杂图形          从锦囊妙计想到的27

时间和空间                               从锦囊妙计想到的28

编写边测解决问题                  从锦囊妙计想到的29

让程序动起来                          从锦囊妙计想到的30

程序往复运动                           从锦囊妙计想到的31

从锦囊妙计想到的02–流程图(分支结构)介绍

——通俗化、儿童化流程、流程图、流程分支介绍

 前次回顾

前一次,  从锦囊妙计想到的01, 我们了解到了, 计算机就是一个 工作者, 不断的执行你预先做好的  锦囊。

这些锦囊, 是我们日常生活中的用语, 从计算机的角度和专业角度来说, 这些锦囊  其实就是  “指令”, 就是, 指挥和命令 计算机去做什么事情。

计算机的核心功能就是  执行(运作、处理, 等等这些名词都可以)这些指令(锦囊)。

故事开始

话说, 刘备找赵云 去江东后,  诸葛亮率领众人守荆州(这里仅仅是借用古人的人名, 编制些小故事, 目的引起孩子们的兴趣, 利于他们学习, 这里的事情同历史、小说等, 没有任何关系)。 曹操探听到这个消息后,立即想, 这是个机会, 刘备不在, 赵云不在, 我何不立即派兵攻打, 拿下他们。于是派兵20万, 直奔荆州而来。诸葛亮闻讯, 立即组织留守人员商议如何拒敌。由于诸葛亮最近身体不适, 也不知道过几天曹军到来时身体是否能恢复到正常状态, 去指挥打仗,因此做了两套行动计划。

计划1:   诸葛亮没病情况下

锦囊1:整肃兵马, 执行锦囊2

锦囊2:筹集粮草, 执行锦囊3

锦囊3:重点地段, 曹军必经之路派人保守,执行锦囊4

锦囊4:若是病好, 则亲自率领军队到城外指挥军队痛击曹军, 执行锦囊5

锦囊5:出城, 带兵指挥作战,。。。  执行下一个锦囊

。。。。。

锦囊18:回城,执行下一个锦囊

锦囊19:庆功, 结束。

 

计划2:   诸葛亮  还是生病的情况下

锦囊1:整肃兵马, 执行锦囊2

锦囊2:筹集粮草, 执行锦囊3

锦囊3:重点地段, 曹军必经之路派人保守,执行锦囊4

锦囊4:若是 仍然生病, 则关羽率领军队到城外指挥军队痛击曹军, 执行锦囊5

锦囊5:出城, 带兵指挥作战,。。。  执行下一个锦囊

。。。。。

锦囊18:回城,执行下一个锦囊

锦囊19:庆功, 结束。

 

上述两个计划 比较类似, 能否直观的看出他们的区别? 我们可以画一张图来说明一下。

j1

上面,画出了全部的锦囊和编号, 以及内容, 另外我们可以用更好一点的方式表现他。

j2

上面图中, 有两个区域,

左边的  区域里面, 是指令的地址, 其实就是锦囊的编号,

右面的  区域里面, 是指令的内容, 其实就锦囊的地址。

具体的一条指令(锦囊的执行过程如下图)

j3

首先执行到一个锦囊时, 先执行锦囊里面的内容(也就是指令), 然后最后根据锦囊的指示, 获取下一个指令得地址, 然后装载入他, 然后执行。

上面是 计划1的 图示, 那么计划2也可以类似的表示一下。

 

 

j5

从上面图片中, 我们可以了解到, 地址似乎有点多余,反正都是 沿着箭头方向前进就好。

这个计划2 同计划1  非常相似。   能否用更好的办法  把两张图合并到一起来。

j66

入上图, 通过增加一个判断环节, 就把两个相似的 计划绘制到一张图中, 并且通过 箭头的执行来 说明工作的 流向, 避免了麻烦的 打开下一个锦囊的罗嗦事情。

 

总结:

本文重点是介绍了  计算机里面一个比较重要的  程序流程的概念。

程序就是 一个个的指令(锦囊)按照一定的顺序执行来完成一定功能的东西。

这些指令的执行顺序, 就像流水一样, 从上到下, 有分叉, 有合并,有流动,因此程序的执行顺序就可以叫做程序流程, 用图示的方法表示出来就是程序流程图。

通过流程图, 我们能直观的了解到, 程序的工作内容(就是锦囊里面的工作呢内容), 程序各个内容之间的执行顺序(就是那个锦囊先执行, 那个后执行), 并且这里也省略了 锦囊编号那个东西, 那个东西其实是 个多余的东西, 仅仅为了 讲故事需要而弄出来的。  在很久很久的以后为了说明更详细的计算机原理, 也许还会把那个锦囊编号弄回来。 但是目前阶段可以把他放到次要位置了。

最后 曹操的人胜利了吗? 还是哪方面胜利了? 其实, 这个是编织出来的故事, 同真正的小说和历史完全不一致。

-----------

最后:

在“从锦囊妙计想到的01” 中我们了解到, 计算机就是一个工作者, 就是不断的执行锦囊的一个人, 锦囊就是指令, 指令(锦囊)是程序员编写的(事先编写好的)。

在 本文我了解到   这些锦囊的执行是可以用一个方便的图示表示出来, 这个图示就是, 流程图, 有了流程图 我们可以更好的了解程序工作过程。

 

本期我们考虑一点复杂的锦囊

本文重点:

本文通过图形化的方法, 方便组织锦囊(指令)的执行过程, 这个图形化的方法, 就是流程图!!

 

相关文章

计算机介绍                                  从锦囊妙计想到的01

流程图(分支结构)介绍          从锦囊妙计想到的02

线程介绍                                     从锦囊妙计想到的03

循环结构介绍                             从锦囊妙计想到的05

流程线程总结                             从锦囊妙计想到的06

cpu和线程定义、开始               从锦囊妙计想到的07

分布式计算                                  从锦囊妙计想到的08

分布式中事件和计数                 从锦囊妙计想到的09

内容总结                                     从锦囊妙计想到的10

数据类型,变量简介                从锦囊妙计想到的11

函数和参数                                从锦囊妙计想到的12

用户交互与数据输入输出       从锦囊妙计想到的13

人机交互界面                            从锦囊妙计想到的15 

过程与对象                                从锦囊妙计想到的16

同步和异步                                从锦囊妙计想到的17

顺序打印                                    从锦囊妙计想到的18

数据输入输出                            从锦囊妙计想到的19

屏幕坐标和打印                        从锦囊妙计想到的20

java函数控制输出                     从锦囊妙计想到的21

逐步细化解决复杂问题           从锦囊妙计想到的22

java入门                                    从锦囊妙计想到的23

java复杂过程分析                   从锦囊妙计想到的25

中间辅助功能解决问题          从锦囊妙计想到的26

叠加操作输出复杂图形          从锦囊妙计想到的27

时间和空间                               从锦囊妙计想到的28

编写边测解决问题                  从锦囊妙计想到的29

让程序动起来                          从锦囊妙计想到的30

程序往复运动                           从锦囊妙计想到的31

从0开始学编程(22)-android开发环境搭建与入门教程

一. Android的钱景

参考2013年9月份的数据, Android生态中国市场份额达9成 追逐者争相涌现, 基本上是市场占有率最高的手机操作系统了, 它市场前景不用多说, 开发它的应用程序自然也非常有前景。

Android生态中国市场份额达9成 追逐者争相涌现

腾讯数码讯(苏扬)北京时间5月16日消息,谷歌Chrome和Android部门主管Sundar Pichai在I/O开发者大会的Keynote环节正式公布,全球Android设备激活总量达9亿的最新数据。而2012年全球Android设备的 激活量仅4亿,同比增长125%。而2011年,该数字刚刚突破1亿。两年时间一共增量高达8亿,对于Android操作系统而言,成绩斐然,同时这也意 味着Android作为世界第一大移动操作系统生态所言非虚。

相比在全球市场庞大的占有量,Android操作系统在发展中国家,尤其是新兴市场的占有量更是惊人。其中,中国市场的Android设备占移动手 持设备总量的9成,这不仅反映出了新兴智能手机市场的巨大潜力,也给其它非Android操作系统生态形成了巨大压力。相比之下,在已经高度成熟发展的北 美智能手机市场,iOS依旧是主力平台,而Android能否借力打力再下一城,全新的操作系统功能特征、更好的交互设计以及更优质的用户体验将成为其考 核新标准。与此同时,面对Windows Phone 8、BB10、Firefox OS等不同定位且针对不同用户群体操作系统的追赶,Android能否保持高速的领跑节奏和领先优势,同样值得商榷。

二. Android来源和历史

Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。
Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L'ève future)中。他将外表像人的机器起名为Android。
Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上的图形符号,[1] 于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐的形状,头上还有两根天线,Android小机器人便诞生了。其中的文字使用了Ascender公司专门制作的称之为“Droid ” 的字体。Android是一个全身绿色的机器人,绿色也是Android的标志。颜色采用了PMS 376C和RGB中十六进制的#A4C639来绘制,这是Android操作系统的品牌象徵。有时候,它们还会使用纯文字的Logo。[1]
2012年7月美国科技博客网站BusinessInsider评选出二十一世纪十款最重要电子产品,Android操作系统和iPhone等榜上有名。

这么有钱景的一个系统, 自然有更多人学习了, 从网络上找一套比较好的 视频教程, 从中挑选了, 几个集初级入门的 视频, 分享出来, 版权属于员作者, 后面会陆续根据 情况不断分享资源出来

http://pan.baidu.com/s/1gdAL6EZ      m7yr   anroid学习教程入门

另外, 搭建android 过程还是比较麻烦的, 特别是下载sdk是个繁琐的事情, 我这里下载好了, 打包了, 大家下载了, 解压缩到 e:\ 就可以 进到里面目录中,找到eclipse.exe 进行执行

http://pan.baidu.com/s/1sj9Lfpb   cyz4     android开发环境, 包括一家下载好的 android sdk文件

android的ADT-Bundle环境快速创建   这个是一篇关于android开发环境的 资料, 可以参考。

下面是从网络上找到的, 比较好的 介绍android开发的教程, 我从中摘抄一部分比较合适的, 原文地址: http://www.ibm.com/developerworks/cn/opensource/os-android-devel/

三. Android 平台

Android 有丰富的功能,因此很容易与桌面操作系统混淆。Android 是一个分层的环境,构建在 Linux 内核的基础上,它包括丰富的功能。UI 子系统包括:

  • 窗口
  • 视图
  • 用于显示一些常见组件(例如编辑框、列表和下拉列表)的小部件

Android 包括一个构建在 WebKit 基础上的可嵌入浏览器,iPhone 的 Mobile Safari 浏览器同样也是以 WebKit 为基础。

Android 提供多种连接选项,包括 WiFi、蓝牙和通过蜂窝(cellular)连接的无线数据传输(例如 GPRS、EDGE 和 3G)。Android 应用程序中一项流行的技术是链接到 Google 地图,以便在应用程序中显示地址。Android 软件栈还提供对基于位置的服务(例如 GPS)和加速计的支持,不过并不是所有的 Android 设备都配备了必需的硬件。另外还有摄像支持。

过去,移动应用程序努力向桌面应 用程序看齐的两个领域分别是图形/媒体和数据存储方法。Android 通过提供对 2D 和 3D 图形的内置支持,包括 OpenGL 库,解决了图形方面的挑战。由于 Android 平台包括流行的开源 SQLite 数据库,因此缓解了数据存储的负担。图 1 显示一个简化的 Android 软件层次结构。

图 1. Android 软件层次结构

Android 软件层次结构

四. 应用程序架构

如 前所述,Android 运行在 Linux 内核上。Android 应用程序是用 Java 编程语言编写的,它们在一个虚拟机(VM)中运行。需要注意的是,这个 VM 并非您想象中的 JVM,而是 Dalvik Virtual Machine,这是一种开源技术。每个 Android 应用程序都在 Dalvik VM 的一个实例中运行,这个实例驻留在一个由 Linux 内核管理的进程中,如下图所示。

图 2. Dalvik VM

Dalvik VM

Android 应用程序由一个或多个组件组成:

活动
具有可视 UI 的应用程序是用活动实现的。当用户从主屏幕或应用程序启动器选择一个应用程序时,就会开始一个动作。
服务
服务应该用于任何需要持续较长时间的应用程序,例如网络监视器或更新检查应用程序。
内容提供程序
可 以将内容提供程序看作数据库服务器。内容提供程序的任务是管理对持久数据的访问,例如 SQLite 数据库。如果应用程序非常简单,那么可能不需要创建内容提供程序。如果要构建一个较大的应用程序,或者构建需要为多个活动或应用程序提供数据的应用程序, 那么可以使用内容提供程序实现数据访问。
广播接收器
Android 应用程序可用于处理一个数据元素,或者对一个事件(例如接收文本消息)做出响应。

Android 应用程序是连同一个 AndroidManifest.xml 文件一起部署到设备的。AndroidManifest.xml 包含必要的配置信息,以便将它适当地安装到设备。它包括必需的类名和应用程序能够处理的事件类型,以及运行应用程序所需的许可。例如,如果应用程序需要访 问网络 — 例如为了下载一个文件 — 那么 manifest 文件中必须显式地列出该许可。很多应用程序可能启用了这个特定的许可。这种声明式安全性有助于减少恶意应用程序损害设备的可能性。

下一节讨论构建 Android 应用程序所需的开发环境。

五. 所需的工具

开始开发 Android 应用程序的最简捷的方式是下载 Android SDK 和 Eclipse IDE(参见 参考资料)。Android 开发可以在 Microsoft® Windows®、Mac OS X 或 Linux 上进行。

本 文假设您使用的是 Eclipse IDE 和用于 Eclipse 的 Android Developer Tools 插件。Android 应用程序是用 Java 语言编写的,但是是在 Dalvik VM(非 Java 虚拟机)中编译和执行的。在 Eclipse 中用 Java 语言编程非常简单;Eclipse 提供一个丰富的 Java 环境,包括上下文敏感帮助和代码提示。Java 代码通过编译后,Android Developer Tools 可确保适当地将它打包,包括 AndroidManifest.xml 文件。

虽然没有 Eclipse 和 Android Developer Tools 插件也可以开发 Android 应用程序,但是那样就需要熟悉 Android SDK。

Android SDK 是作为一个 ZIP 文件发布的,可以将该文件解压到硬盘上的一个目录中。由于有多个 SDK 更新,建议有意识地组织开发环境,以便在不同的 SDK 安装之间轻松地切换。SDK 包括:

android.jar
Java 归档文件,其中包含构建应用程序所需的所有的 Android SDK 类。
documention.html 和 docs 目录
本地和网上提供的 SDK 文档。这些文档的主要形式为 JavaDocs,以便于在 SDK 中导航大量的包。文档还包括一个高级开发指南和 Android 社区的链接。
Samples 目录
samples 子目录包含各种应用程序的源代码,包括 ApiDemo,该应用程序演示了很多 API。这个示例应用程序可以作为 Android 应用程序开发的良好起点。
Tools 目录
包含所有用于构建 Android 应用程序的命令行工具。最常用、最有用的工具是 adb 实用程序(Android Debug Bridge)。
usb_driver
该目录包含将开发环境连接到支持 Android 的设备(例如 G1 或 Android Dev 1 解锁开发手机)所需的驱动程序。只有 Windows 平台的开发人员才需要这些文件。

Android 应用程序可以在实际的设备上运行,也可以在 Android SDK 附带的 Android Emulator 上运行。图 3 显示 Android Emulator 的主屏幕。

图 3. Android Emulator

Android Emulator

Android Debug Bridge

adb 实用程序支持一些可选命令行参数,以提供强大的特性,例如复制文件到设备或从设备复制文件。可以使用 shell 命令行参数连接到手机本身,并发送基本的 shell 命令。图 4 显示在通过 USB 线连接到 Windows 笔记本电脑的一个实际设备上运行的 adb shell 命令。

图 4. 使用 adb shell 命令

使用 adb shell 命令

在这个 shell 环境中,可以:

  • 显示网络配置,网络配置可显示多个网络连接。注意这多个网络连接:
    • lo 是本地或 loopback 连接。
    • tiwlan0 是 WiFi 连接,该连接由本地 DHCP 服务器提供一个地址。
  • 显示 PATH 环境变量的内容。
  • 执行 su 命令,以成为超级用户。
  • 将目录改为 /data/app,其中存放用户应用程序。
  • 列出包含某个应用程序的目录。Android 应用程序文件实际上是归档文件,可通过 WinZip 之类的软件查看。扩展名为 apk。
  • 发出 ping 命令,查看 Google.com 是否可用。

从相同的命令提示符环境中,还可以与 SQLite 数据库交互,启动程序以及执行许多其他系统级任务。想像一下您正在连接到电话,因此这是非常了不起的功能。

在下一节,您将创建一个简单的 Android 应用程序。

六. 编写一个基本的应用程序

本节展示如何构建一个 Android 应用程序。示例应用程序非常简单:一个修改后的 “Hello Android” 应用程序。您将进行一个微小的修改,使屏幕背景全部变为白色,以便把手机用作手电筒。这个例子不是很有创意,但是可以作为一个有用的例子。请 下载 完整的源代码。

为了在 Eclipse 中创建应用程序,选择 File > New > Android project,这将启动 New Android Project 向导。

图 5. New Android project 向导

new Android project 向导

接下来,创建一个简单的应用程序,该应用程序有一个活动,并且在 main.xml 中有一个 UI 布局。布局包含一个文本元素,您将修改这个文本元素,以显示 Android FlashLight。下面的清单显示了这个简单的布局。

清单 1. Flashlight 布局
<?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"
    android:background="@color/all_white">
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" android:textColor="@color/all_black" 
   android:gravity="center_horizontal"/>
</LinearLayout>

在 strings.xml 中创建两个颜色资源。

清单 2. strings.xml 中的颜色
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Android FlashLight</string>
    <string name="app_name">FlashLight</string>
    <color name="all_white">#FFFFFF</color>
    <color name="all_black">#000000</color>
</resources>

主屏幕布局有一个定义为 all_white 的背景色。在 strings.xml 文件中,可以看到 all_white 被定义为一个值为 #FFFFFF 的 RGB 三元组,即纯白。

布局包含一个 TextView,这实际上是一块静态文本。它是不可编辑的。文本被设为黑色,并通过 gravity 属性设为水平居中。

该应用程序有一个名为 FlashLight.java 的 Java 源文件,如以下清单所示。

清单 3. Flashlight.java
package com.msi.flashlight;
import android.app.Activity;
import android.os.Bundle;
public class FlashLight extends Activity {
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

该代码是直接来自 New Project 向导的模板代码:

  • 它是 Java 包 com.msi.flashlight 的一部分。
  • 它有两个 import:
    • 一个用于 activity 类
    • 一个用于 bundle 类
  • 当该活动发起后,onCreate 方法被调用,传入一个 savedInstanceState。对于我们来说,不必关心这个 bundle。只有在暂停然后恢复活动时才会用到。
  • onCreate 方法覆盖了同名的 activity 类方法。它调用超类的 onCreate 方法。
  • setContentView() 的调用将关联 main.xml 文件中定义的 UI 布局。main.xml 和 strings.xml 中的任何内容都自动映射到 R.java 源文件中定义的常量。任何时候都不要直接编辑这个文件,因为它随着每次构建而改变。

运行该应用程序可以看到一个白色屏幕,其中有黑色文本。

图 6. flashlight 的白色屏幕

flashlight 的白色屏幕

下面显示用于 FlashLight 应用程序的 AndroidManifest.xml 文件。

清单 4. 用于 FlashLight 的 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.msi.flashlight"
      android:versionCode="1"
      android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".FlashLight"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

该文件是由用于 Eclipse 的 Android Developer Tools 插件自动创建的。您不需要做任何事情。

当然,这个应用程序并不是很强大。但是如果希望读点书,又不想打扰正在睡觉的爱人,或者如果需要在断电时去地下室查看保险丝盒,那么这个应用程序还是很方便的。

 

相关文章

从0开始学编程(22)-android开发环境搭建与入门教程

从0开始学编程(21)-Java网络编程入门

从0开始学编程(20)-Java线程入门

从0开始学编程(19)–java流概念入门

从0开始学编程(18)–java快速入门

从0开始学编程(17)–面向对象思想了解

从0开始学编程(16)–数据库加强

从0开始学编程(15)–总结篇-php编程强化巩固

从0开始学编程(14) – Php数据相关操作

从0开始学编程(13) Php获取form表单数据

从0开始学编程(12) 使用 eclipse的 php插件单步调试php程序

从0开始学编程(11) 使用 eclipse的 php插件 调试php程序

从0开始学编程(10) 用例子学习bootstrap的布局

从0开始学编程(9) – css、html和js简便工具

从0开始学编程(8) – 数据库简介

从0开始学编程(7) – 常用网站介绍

从0开始学编程(6)–在多了解一下php都涉及些啥东西

从0开始学编程(5)–方便的php编辑工具notepad++

从0开始学编程(4)–html基础入门

从0开始学编程(3)–学习必备的基础技能

从0开始学编程(2)–学习的方法和目标

从0开始学编程(1)–xampp配置php学习环境

从0开始学编程(21)-Java网络编程入门

java网络编程是java非常重要的一个部分, 现在没啥程序是不联网的, 极少数程序是单机的外, 大部分都要连接网络, java的网络功能已经很强大, 同时由于java有非常庞大的开源社区,里面各种资源都有, 基本常见需要的网络等程序, 网络开发框架非常齐全, 通过java开发的网络程序也比较简单, 性能也不差。 能满足各种不同需求的。

另外网络编程也涉及很多java的基础知识, 对java流的读取方式, java的线程等等都要有很好的理解才能做好。

学习java的网络编程一方面可以学习网络知识,同时可以巩固前面学习的java等知识。

还是从网络上找个 网络编程的知识来, 可以简单看看, 能看明白多少都可以总之看来, 在今后工作中慢慢 加固就好!!

这里有两份 java网络编程的 视频, 都是比较好的!  前面一个 比较简洁, 快速的讲解了网络编程的 相关总体内容, 后面比较详细。

http://pan.baidu.com/s/1c08PIIc  eemv       马士兵的  网络编程, 比较好, 快速入门。

http://pan.baidu.com/s/1gdncWfh vp7f 传智播客毕向东Java基础视频教程- 网络基础知识, 这个讲的比较全面, 还是很值得一看的。

另外, 下面是从网络查找的java相关资料,也可以参考阅读。

Java网络编程菜鸟进阶:TCP和套接字入门

JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)这两个数据传输协议的支持。本文开始探讨 TCP。

TCP 基础知识

在“服务器-客户端”这种架构中,服务器和客户端各自维护一个端点,两个端点需要通过网络进行数据交换。TCP 为这种需求提供了一种可靠的流式连接,流式的意思是传出和收到的数据都是连续的字节,没有对数据量进行大小限制。一个端点由 IP 地址和端口构成(专业术语为“元组 {IP 地址, 端口}”)。这样,一个连接就可以由元组 {本地地址, 本地端口, 远程地址, 远程端口} 来表示。

连接过程

在 TCP 编程接口中,端点体现为 TCP 套接字。共有两种 TCP 套接字:主动和被动,“被动”状态也常被称为“侦听”状态。服务器和客户端利用套接字进行连接的过程如下:

1、服务器创建一个被动套接字,开始循环侦听客户端的连接。

2、客户端创建一个主动套接字,连接服务器。

3、服务器接受客户端的连接,并创建一个代表该连接的主动套接字。

4、服务器和客户端通过步骤 2 和 3 中创建的两个主动套接字进行数据传输。

下面是连接过程的图解:

TCP 连接

一个简单的 TCP 服务器

JDK 提供了 ServerSocket 类来代表 TCP 服务器的被动套接字。下面的代码演示了一个简单的 TCP 服务器(多线程阻塞模式),它不断侦听并接受客户端的连接,然后将客户端发送过来的文本按行读取,全文转换为大写后返回给客户端,直到客户端发送文本行 bye:

public class TcpServer implements Runnable {
private ServerSocket serverSocket;

public TcpServer(int port) throws IOException {
// 创建绑定到某个端口的 TCP 服务器被动套接字。
serverSocket = new ServerSocket(port);
}

@Override
public void run() {
while (true) {
try {
// 以阻塞的方式接受一个客户端连接,返回代表该连接的主动套接字。
Socket socket = serverSocket.accept();
// 在新线程中处理客户端连接。
new Thread(new ClientHandler(socket)).start();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}

public class ClientHandler implements Runnable {
private Socket socket;

public ClientHandler(Socket socket) {
this.socket = Objects.requireNonNull(socket);
}

@Override
public void run() {
try (Socket s = socket) { // 减少代码量的花招……
// 包装套接字的输入流以读取客户端发送的文本行。
BufferedReader in = new BufferedReader(new InputStreamReader(
s.getInputStream(), StandardCharsets.UTF_8));
// 包装套接字的输出流以向客户端发送转换结果。
PrintWriter out = new PrintWriter(new OutputStreamWriter(
s.getOutputStream(), StandardCharsets.UTF_8), true);

String line = null;
while ((line = in.readLine()) != null) {
if (line.equals("bye")) {
break;
}

// 将转换结果输出给客户端。
out.println(line.toUpperCase(Locale.ENGLISH));
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

阻塞模式的编程方式简单,但存在性能问题,因为服务器线程会卡死在接受客户端的 accept() 方法上,不能有效利用资源。套接字支持非阻塞模式,现在暂时略过。

一个简单的 TCP 客户端

JDK 提供了 Socket 类来代表 TCP 客户端的主动套接字。下面的代码演示了上述服务器的客户端:

public class TcpClient implements Runnable {
private Socket socket;

public TcpClient(String host, int port) throws IOException {
// 创建连接到服务器的套接字。
socket = new Socket(host, port);
}

@Override
public void run() {
try (Socket s = socket) { // 再次减少代码量……
// 包装套接字的输出流以向服务器发送文本行。
PrintWriter out = new PrintWriter(new OutputStreamWriter(
s.getOutputStream(), StandardCharsets.UTF_8), true);
// 包装套接字的输入流以读取服务器返回的文本行。
BufferedReader in = new BufferedReader(new InputStreamReader(
s.getInputStream(), StandardCharsets.UTF_8));

Console console = System.console();
String line = null;
while ((line = console.readLine()) != null) {
if (line.equals("bye")) {
break;
}

// 将文本行发送给服务器。
out.println(line);
// 打印服务器返回的文本行。
console.writer().println(in.readLine());
}

// 通知服务器关闭连接。
out.println("bye");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

从 JDK 文档可以看到,ServerSocket 和 Socket 在初始化的时候,可以设定一些参数,还支持延迟绑定。这些东西对性能和行为都有所影响。后续两篇文章将分别详解这两个类的初始化。

另外推荐有时间可以查找一下netty的资料。

Netty是由JBOSS提供的一个java开源框架是做java网络开发的框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
“快速”和“简单”并不意味着会让你的最终应用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。

推荐看:《Netty权威指南》这个本书, 前面一部分对java的io,网络模型有很好的介绍, 大家可以 到csdn的下载频道搜索, 下载。

下面的资料都是将来网络编程要涉及到的, 现在看看了解了解

Java NIO与IO的区别和比较

在Java7中NIO.2异步执行

Java NIO类库Selector机制解析

 

 

相关文章

从0开始学编程(22)-android开发环境搭建与入门教程

从0开始学编程(21)-Java网络编程入门

从0开始学编程(20)-Java线程入门

从0开始学编程(19)–java流概念入门

从0开始学编程(18)–java快速入门

从0开始学编程(17)–面向对象思想了解

从0开始学编程(16)–数据库加强

从0开始学编程(15)–总结篇-php编程强化巩固

从0开始学编程(14) – Php数据相关操作

从0开始学编程(13) Php获取form表单数据

从0开始学编程(12) 使用 eclipse的 php插件单步调试php程序

从0开始学编程(11) 使用 eclipse的 php插件 调试php程序

从0开始学编程(10) 用例子学习bootstrap的布局

从0开始学编程(9) – css、html和js简便工具

从0开始学编程(8) – 数据库简介

从0开始学编程(7) – 常用网站介绍

从0开始学编程(6)–在多了解一下php都涉及些啥东西

从0开始学编程(5)–方便的php编辑工具notepad++

从0开始学编程(4)–html基础入门

从0开始学编程(3)–学习必备的基础技能

从0开始学编程(2)–学习的方法和目标

从0开始学编程(1)–xampp配置php学习环境

从0开始学编程(20)-Java线程入门

线程是个非常重要的 概念, 在现在手机都是多核的系统了, 程序不支持多线程, 是不可现象的, 什么是多线程, 线程同进程是什么关系?

下面一个文章简单介绍了,线程和进程的基本概念, 比较有意思, 推荐大家看看!

进程与线程的一个简单解释

另外, 线程也是比较难懂的, 涉及到了很多东西, 但是从入门的角度将, 推荐一个马士兵的 教程, 大家可以通过这进行入门。
http://pan.baidu.com/s/1bn8jBTP j2ke 多线程基础入门

同时也可以参考下面的 一些从网络上找的资料来了解一下线程, 特别是主线程和工作者线程的概念。 常见的线程创建等等。

 

主线程

首先每个 Java 程序都是从主线程开始运行的,主线程就是执行 main() 方法的那个线程。在 main() 方法中获取当前线程很简单:

// 示例1
public static void main(String[] args) {
    Thread mainThread = Thread.currentThread();
    System.out.println("当前线程: " + mainThread.getName());
}

Thread 对象的文档在这里Thread 对象包含很多方法和属性,除了上面例子当中的 name 属性外,还有状态、优先级等等。现在我们只需要知道 main() 方法是在主线程中运行就可以了。

线程是可以暂停的

我们通常使用 sleep() 方法来使线程在指定的时间内暂停执行。下面是一个在主线程中执行循环和暂停的例子:

// 示例2
public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
        System.out.println(i);

        try {
            Thread.sleep(500);    // 暂停线程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

注意:首先,sleep() 方法是静态的,因为它永远只能用在当前的线程上;其次,sleep() 方法会抛出异常,该异常通常发生在暂停状态被打断时。所以这里用 try-catch 代码块包围起来。

sleep() 方法接受一个 long 类型的参数,指明需要暂停多少毫秒。这个例子当中,我们循环输出 i 变量,共循环 10 次,每输出一次就暂停 500 毫秒。

你可能觉得整个程序的运行时间会是精确的 5000 毫秒,但请千万不要这么认为,首先 sleep() 方法并非十分精确,CPU 在各个线程之间切换会要花掉很微量的一点时间,如果这个例子循环次数不是 10 次而是十万次百万次,那么积累的误差就会比较大了;其次,代码中的 System.out.println() 方法和 for 循环本身也要花掉一点时间,所以每次循环不会是绝对精确的 500 毫秒。

创建新的线程

除了主线程外,我们还可以创建和执行另外的线程。执行新线程的方式是调用该线程对象的 start() 方法。

// 示例3
public static void main(String[] args) {
    Thread thread1 = new Thread();
    thread1.start();    // 启动线程
}

从这个例子中我们可以看到,thread1 是一个通过 new Thread() 创建出来的对象。把线程看作是对象这点十分重要,这意味着我们可以创建 Thread 的子类,而子类的对象仍然是线程对象。执行这段代码什么输出都没有,因为我们没有为 thread1 定义要执行什么操作。下面的例子中,我们让 thread1 来做循环输出。

// 示例4
public static void main(String[] args) {

    Thread thread1 = new Thread() {

        @Override
        public void run() {               // 指定线程要做的事
            for (int i = 0; i < 10; i++) {
                System.out.println(i);

                try {
                    Thread.sleep(500);    // 暂停线程
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };

    thread1.start();    // 启动线程
}

这里我们创建了一个 Thread 类的匿名子类,并覆写了 run() 方法。通过覆写 run() 方法,我们可以指定线程要做哪些事情。

线程之间没有父子关系
线程与线程之间是平等的,并没有父子关系。不过 Java 为了方便管理线程,定义了一个叫线程组(ThreadGroup)的类,线程组之间可以存在父子关系。不过这个概念平常用的很少,所以这里只是顺带提下,不作详细介绍。

线程是并行执行的

在示例4中,thread1 其实是与主线程并行执行的。为了演示这点,我们首先将这个循环提取成一个方法:

private static void printNumbers(int start, int end) {
    for (int i = start; i < end; i++) {
        System.out.println(i);

        try {
            Thread.sleep(500);    // 暂停线程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

然后示例4就变成了:

public static void main(String[] args) {

    Thread thread1 = new Thread() {

        @Override
        public void run() {
            printNumbers(0, 10);  // 提取出来的方法
        }
    };

    thread1.start();    // 启动线程
}

我们在最后面添加一行,让主线程在启动 thread1 之后也做一个循环输出:

// 示例5
public static void main(String[] args) {

    Thread thread1 = new Thread() {

        @Override
        public void run() {
            printNumbers(0, 10);  // 循环输出
        }
    };

    thread1.start();        // 启动线程
    printNumbers(100, 110); // 主线程也循环输出
}

执行 main() 方法,在输出中你可以看到 0~9 与 100~109 交替出现,这说明主线程和 thread1 在同时执行。

将线程中的逻辑独立出来

为了使线程中的逻辑能够被重用,我们通常将其声明为一个独立的类。在前面的代码示例中,我们都是以匿名类的方式来创建线程的。独立声明一个线程类的方式是这样的:

// 示例6
public class MyThread extends Thread {

    private int start;
    private int end;

    // 构造方法
    public MyThread(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    public void run() {
        printNumbers();
    }

    private void printNumbers() {
        for (int i = this.start; i < this.end; i++) {
            System.out.println(i);

            try {
                Thread.sleep(500);    // 暂停线程
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在示例 6 中我们可以看到,执行这个线程所需的两个参数现在变成了 MyThread 的两个成员。这是我们向线程传递执行参数的一般方式。提取成独立的类之后,线程使用起来就非常简单了:

public static void main(String[] args) {
    new MyThread(0,10).start();
    new MyThread(100,110).start();
    new MyThread(1000,1010).start();
}

线程的返回值

我们有时候希望当线程执行完毕时,我们能得到一个结果。在示例 6 中我们了解了向线程传递参数的方式,类似的我们也可以为线程类定义一个成员用来保存线程的执行结果。下面是一个例子:

// 示例7
public class ThreadWithReturnValue extends Thread {

    public String result;

    @Override
    public void run() {
        try {
            Thread.sleep(3000);
            this.result = "result";  // 假设产生结果需要比较长的时间
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        ThreadWithReturnValue thread = new ThreadWithReturnValue();
        thread.start();
        Thread.sleep(3100);
        System.out.println(thread.result);  // 获得结果
    }
}

在这个例子当中,ThreadWithReturnValue 线程产生结果需要 3 秒钟,那么主线程就需要等待 3 秒以上才能得到 "result",否则就只能得到 null。在实际情况中,我们并不知道线程产生结果需要多长时间,而我们也不想无限制的等下去。

出于这样的目的,Thread 对象为我们提供了 join() 方法,用于等待指定的线程直到执行完毕。示例 7 当中的 main() 方法可以改造成这样子:

public static void main(String[] args) throws Exception {
    ThreadWithReturnValue thread = new ThreadWithReturnValue();
    thread.start();
    thread.join();      // 等待直到 thread 执行完毕
    System.out.println(thread.result);
}

这样我们就能在线程执行完毕时立刻得到结果了。我们可以运行多个线程,然后依次调用它们的 join() 方法,这样等待的时间就是它们当中运行最久的那个线程的运行时间。当它运行完毕时,我们就得到所有线程的执行结果了。线程的入门概念就介绍到这里,本文只是介绍非常基本的概念,Java 在处理多线程和并发方面还有很多很复杂的东西等待你去了解和尝试。

 

相关文章

从0开始学编程(22)-android开发环境搭建与入门教程

从0开始学编程(21)-Java网络编程入门

从0开始学编程(20)-Java线程入门

从0开始学编程(19)–java流概念入门

从0开始学编程(18)–java快速入门

从0开始学编程(17)–面向对象思想了解

从0开始学编程(16)–数据库加强

从0开始学编程(15)–总结篇-php编程强化巩固

从0开始学编程(14) – Php数据相关操作

从0开始学编程(13) Php获取form表单数据

从0开始学编程(12) 使用 eclipse的 php插件单步调试php程序

从0开始学编程(11) 使用 eclipse的 php插件 调试php程序

从0开始学编程(10) 用例子学习bootstrap的布局

从0开始学编程(9) – css、html和js简便工具

从0开始学编程(8) – 数据库简介

从0开始学编程(7) – 常用网站介绍

从0开始学编程(6)–在多了解一下php都涉及些啥东西

从0开始学编程(5)–方便的php编辑工具notepad++

从0开始学编程(4)–html基础入门

从0开始学编程(3)–学习必备的基础技能

从0开始学编程(2)–学习的方法和目标

从0开始学编程(1)–xampp配置php学习环境