<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:clearspace="http://www.jivesoftware.com/xmlns/clearspace/rss" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Main : Document List - All Communities</title>
    <link>http://developer.sonyericsson.com/community/index.jspa?view=documents</link>
    <description>Latest Documents in Main</description>
    <language>en</language>
    <pubDate>Sun, 22 Nov 2009 07:27:25 GMT</pubDate>
    <generator>Clearspace 2.5.7 (http://jivesoftware.com/products/clearspace/)</generator>
    <dc:date>2009-11-22T07:27:25Z</dc:date>
    <dc:language>en</dc:language>
    <item>
      <title>扫盲贴1，什么叫智能手机，智能手机的操作系统有几种。</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3260</link>
      <description>&lt;!-- [DocumentBodyStart:8cb29dd4-e47a-4abc-b654-32a35071bc1e] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;什么是智能手机，说通俗一点就是一个简单的“1＋1＝”的公式，“掌上电脑＋手机＝智能手机”。从广义上说，智能手机除了具备手机的通话功能外，还具备了pda的大部分功能，特别是个人信息管理以及基于无线数据通信的浏览器和电子邮件功能。智能手机为用户提供了足够的屏幕尺寸和带宽，既方便随身携带，又为软件运行和内容服务提供了广阔的舞台，很多增值业务可以就此展开，如：股票、新闻、天气、交通、商品、应用程序下载、音乐图片下载等等。融合3c（computer、communication、comsumer）的智能手机必将成为未来手机发展的新方向。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;那么智慧型手机呢？通俗一点的说法就是“文曲星＋手机＝智慧型手机”，大家一对比就能知道，掌上电脑和文曲星有着很大的区分，从功能应用上来说，掌上电脑就有着自己十分明显的优势。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;其实智能手机和智慧型手机最容易区分的一点就是“是否拥有操作系统”。下面就让我们来看看成为一部智能手机所必备的几个条件：&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1、具备普通手机的全部功能，能够进行正常的通话，发短信等手机应用。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2、具备无线接入互联网的能力，即需要支持gsm网络下的gprs或者cdma网络下的cdma 1x或者3g网络。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3、具备pda的功能，包括pim（个人信息管理），日程记事，任务安排，多媒体应用，浏览网页。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4、具备一个具有开放性的操作系统，在这个操作系统平台上，可以安装更多的应用程序，从而使智能手机的功能可以得到无限的扩充。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;既然只有具备操作系统的手机才配叫智能手机，那其的操作系统种类又有哪些呢？既然智能手机的诞生和掌上电脑有关，那它的操作系统也肯定会与掌上电脑有关。symbian和windows ce、palm、linux依旧是这四大阵营，不过与pda操作系统中palm和windows ce两强争霸的局面不同，在智能手机操作系统中，symbian却抢得了先机，索爱、诺基亚、摩托罗拉以及松下等公司基本上都采用了symbian为主的操作系统。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;symbian：symbian的很像是windows和linux的结合体，有着良好的界面，采用内核与界面分离技术，对硬件的要求比较低，支持c++,vb和j2me。兼容性较差。代表机型：诺基亚6600索爱p908西门子sx1&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;windows ce：由于微软的强大实力，windows ce有很多先天的优势，比如拥有强大的内建软件，word,excel,ie,msn messenger,outlook,mediaplay等，其它系统上的同类软件很难做到如此完善和统一。由于硬件要求极高使价格也高了，耗电还是很比较大，系统稳定性差。代表机型：多普达智能手机系列。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;palm：这种系统对硬件的要求很低，因此在价格上能很好的控制，耗电量也很小。 palm 由于比较早出现，应用在手机上还是有很多不完善的地方，相同于其它两大系统，palm 显得比较弱小。代表机型：三星sgh-i500treo 600。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;linux：linux具有源代码开放、软件授权费用低、应用开发人才资源丰富等优点，便于开发个人和行业应用。起步太晚，没有雄厚的基础。代表机型：摩托罗拉a760 ，三星i519 。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;除了这四个操作系统以外，大家是不是还听说过什么s60、s70等操作系统，这些又是什么呢？其实这些都是symbian的分支，为什么这么说呢？原来symbian os只是一个操作系统的内核，而界面可以由各个厂商自已开发，9210与3650的界面就是不同的，而p908与6600又不相同，6600用的是series 60界面,p908用的是uiq界面，这也导至了，因为微小的差别使程序不能通用，就算是9210的symbian os 6.0和3650的6.1的程序也大多是不兼容的，原因就是因为界面接口的问题，相信对于这个问题的解决方案的出台，我们需要等待一些日子了。在不同界面中，有着不同的优点和缺点，series 60容易操作，切换任务和关闭任务容易，而uiq界面上可支持手写操作，功能更多，不过切换和关闭任务比较麻烦。好了，言归正传。下面还是给大家说说如何走出智能手机和智慧型手机选购中的误区。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;既然要走出这个误区，首先我们就应该先来认识认识它的真面目。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;误区一：可以手写输入的手机&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;很多朋友都认为可以手写输入的手机一般都是智能手机。其实不然，这两者并没有直接的因果联系。如波导的多易随e859和tcl的e757都具有手写功能，因为没有操作系统，所以我们给它们定义为智慧型手机。反之，多普达535，作为一款智能手机，但是却不支持手写功能，我们总不会也把它看作为智慧型手机吧！所以这两者没有直接的因果关系。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;误区二：内置功能丰富的手机&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;是不是功能越多的手机就是智能手机呢？答案是否定的。例如cect的t868内置的功能也非常多，也集成了pim功能。难道我们也把它看为智能手机吗？举个很恰当的例子来说明这个问题。以前386、486电脑才在中国大陆销售的时候，市面上就出现了一款与电脑功能相仿的“小霸王”学习机，不知道大家听说过这个产品没有，反正笔者自己家里有一台。因为当时涉及电脑的软件非常少，而学习机里内置的学习软件基本上跟电脑软件一样，所以两者的差别并不是很大。但随着电脑技术的发展，应用和游戏软件越来越多的被开发出来，学习机的市场就逐渐萎缩。如果想让学习机跟上电脑软硬件升级的步伐，是十分困难的。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;同理，虽然现在许多生产智慧型手机的厂商，可以提供在线升级软件等功能，可是供用户选择的面毕竟很少。因为软件的更新需要手机厂商花费更多的精力，在如今这个群雄混战的手机市场，新产品的上市时间才是手机厂商最关心的问题。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;反过来说，智能手机的功能就一定很丰富。为什么呢？因为其自身的操作系统在其中发挥了很大的作用。symbian和windows ce、palm、linux这四个操作系统相对应的智能手机都会在网上找到相当可观的免费资源。这是一件多么惬意的事情啊！&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;看到这里相信大家已经对如何区分智能手机和智慧型手机心里有个谱了吧！不过从价格上来看，智能手机的报价明显比智慧型手机高出一截，毕竟是“一分钱一分货”嘛。在这里提醒想购买此类型手机的读者注意，再购买手机之前，需考虑清楚自己需要什么类型的手机，在购买的时候一定要问清楚，不要被手机表面的东西所迷惑。&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:8cb29dd4-e47a-4abc-b654-32a35071bc1e] --&gt;</description>
      <pubDate>Wed, 14 Oct 2009 06:48:00 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3260</guid>
      <dc:date>2009-10-14T06:48:00Z</dc:date>
      <clearspace:dateToText>30 minutes ago</clearspace:dateToText>
      <clearspace:replyCount>1</clearspace:replyCount>
    </item>
    <item>
      <title>转 [J2ME] MMAPI的Cannot parse this type of AMR异常之讨论</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3332</link>
      <description>&lt;!-- [DocumentBodyStart:16b1bb67-9af6-4587-bba0-5bee8508c4e5] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;&lt;h2&gt;&lt;h1 class="title_txt"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 10pt;"&gt;转自&lt;/span&gt;&lt;/span&gt;&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 10pt;"&gt;旁观者 - 郑昀&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 10pt;"&gt;的博客 &lt;strong style="background-color: #fcfaf4;"&gt;&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc/archive/2006/04/17/666696.aspx"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 10pt;"&gt;http://blog.csdn.net/zhengyun_ustc/archive/2006/04/17/666696.aspx&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;[J2ME] MMAPI&lt;/span&gt;&lt;span&gt;的&lt;/span&gt;&lt;span lang="EN-US"&gt;Cannot parse this type of AMR&lt;/span&gt;&lt;span&gt;异常之讨论&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;郑昀&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt; &lt;/span&gt;&lt;span&gt;草拟&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt; 20060417&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="font-size: 18pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;现象&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;首先，我们假设遇到这种错误的人们了解如何使用&lt;/span&gt;&lt;span lang="EN-US"&gt;MMAPI&lt;/span&gt;&lt;span&gt;，从而排除代码使用不当问题。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;那么在播放&lt;/span&gt;&lt;span lang="EN-US"&gt;3gp&lt;/span&gt;&lt;span&gt;媒体文件时遇到&lt;/span&gt;&lt;span lang="EN-US"&gt;“&lt;strong&gt;java.lang.Exception: Cannot parse this type of AMR&lt;/strong&gt;”&lt;/span&gt;&lt;span&gt;的异常错误，如果怀疑是&lt;/span&gt;&lt;span lang="EN-US"&gt;ffmpeg&lt;/span&gt;&lt;span&gt;或者其他&lt;/span&gt;&lt;span&gt;转换程序造成的话，那么你可以把&lt;/span&gt;&lt;span lang="EN-US"&gt;Nokia&lt;/span&gt;&lt;span&gt;手机自己拍摄的录像传到&lt;/span&gt;&lt;span lang="EN-US"&gt;PC&lt;/span&gt;&lt;span&gt;机上，这种文件格式就是&lt;/span&gt;&lt;span lang="EN-US"&gt;3gp&lt;/span&gt;&lt;span&gt;的，而且肯定是&lt;/span&gt;&lt;span lang="EN-US"&gt;Nokia&lt;/span&gt;&lt;span&gt;自己的手机程序能播放的。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;但是，我用&lt;/span&gt;&lt;span lang="EN-US"&gt;mmapi&lt;/span&gt;&lt;span&gt;在&lt;/span&gt;&lt;span lang="EN-US"&gt;Nokia S60&lt;/span&gt;&lt;span&gt;模拟器（Nokia Developer's Suite 3.0 for J2ME所携带的模拟器）上播放这种Nokia手机生成的3gp文件时依然得到&lt;/span&gt;&lt;span lang="EN-US"&gt;“&lt;strong&gt;java.lang.Exception: Cannot parse this type of AMR&lt;/strong&gt;”&lt;/span&gt;&lt;span&gt;错误，没有声音，只有视频。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;我用下面的命令行：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" width="94%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="540"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;Ffmpeg&lt;/strong&gt;&lt;strong&gt;转换命令&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="540"&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176x144 -acodec aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="540"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;或者&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 176x144 -b 128 -r 15 test.3gp&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;转换出来的&lt;/span&gt;&lt;span lang="EN-US"&gt;3gp&lt;/span&gt;&lt;span&gt;文件，都只能够在&lt;/span&gt;&lt;span lang="EN-US"&gt;Nokia S60&lt;/span&gt;&lt;span&gt;模拟器（Nokia Developer's Suite 3.0 for J2ME所携带的模拟器）上播放视频，但没有声音，也得到了大量的&lt;/span&gt;&lt;strong&gt;java.lang.Exception: Cannot parse this type of AMR&lt;/strong&gt;&lt;span&gt;错误提示。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;我为什么要怀疑仅仅是&lt;/span&gt;&lt;span lang="EN-US"&gt;S60&lt;/span&gt;&lt;span&gt;模拟器的问题呢。因为我把转换好的&lt;/span&gt;&lt;span lang="EN-US"&gt;3gp&lt;/span&gt;&lt;span&gt;文件放在我的服务器上，用&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" width="94%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="540"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;简单的播放代码&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="540"&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;player = Manager.createPlayer(url);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;player.realize();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span lang="EN-US"&gt;player.prefetch();&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;这种代码在&lt;/span&gt;&lt;strong&gt;Nokia7610&lt;/strong&gt;&lt;strong&gt;真机&lt;/strong&gt;&lt;span&gt;上运行播放这个远端资源&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://218.249.90.118/toodou/test.3gp"&gt;http://218.249.90.118/toodou/test.3gp&lt;/a&gt; &lt;/span&gt;&lt;span&gt;，结果正常地播放了，&lt;strong&gt;有声音，有图像&lt;/strong&gt;！&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;所以说明&lt;/span&gt;&lt;span lang="EN-US"&gt;Nokia 7610&lt;/span&gt;&lt;span&gt;真机的&lt;/span&gt;&lt;span lang="EN-US"&gt;MMAPI&lt;/span&gt;&lt;span&gt;对于&lt;/span&gt;&lt;span lang="EN-US"&gt;3gp&lt;/span&gt;&lt;span&gt;文件中的音频解析是没问题的。出问题的是&lt;/span&gt;&lt;span lang="EN-US"&gt;S60&lt;/span&gt;&lt;span&gt;模拟器（Nokia Developer's Suite 3.0 for J2ME所携带的模拟器）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:16b1bb67-9af6-4587-bba0-5bee8508c4e5] --&gt;</description>
      <pubDate>Fri, 20 Nov 2009 11:46:19 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3332</guid>
      <dc:date>2009-11-20T11:46:19Z</dc:date>
      <clearspace:dateToText>1 day, 20 hours ago</clearspace:dateToText>
    </item>
    <item>
      <title>转 [J2ME]手机流媒体之实作[附源码][与RTSP/MMS协议无关]</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3331</link>
      <description>&lt;!-- [DocumentBodyStart:bfcf5df4-d624-4c74-96f4-c845fda59a7b] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;&lt;h1 class="title_txt"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 10pt;"&gt;转自&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc"&gt;旁观者 - 郑昀&lt;/a&gt;的博客&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc/archive/2006/03/28/641991.aspx"&gt;&lt;span&gt;&lt;span&gt;http://blog.csdn.net/zhengyun_ustc/archive/2006/03/28/641991.aspx&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1 class="title_txt"&gt;  [J2ME]手机流媒体之实作[附源码][与RTSP/MMS协议无关]&lt;cite class="fav_csdnstylebykimi"&gt;&lt;/cite&gt;&lt;/h1&gt;&lt;div class="blogstory"&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" width="93%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="348"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;郑昀@ultrapower&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="147"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;产品名称&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="121"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;strong&gt;产品版本&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="348"&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;Keyword: JavaME Streaming Audio MMAPI&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="147"&gt;&lt;p align="center" class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;StreamingDemo&lt;/strong&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="121"&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt;"&gt;1.0.13&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p align="right" class="MsoNormal"&gt;&lt;strong&gt; [J2ME]现行环境下&lt;/strong&gt;&lt;strong&gt;手机&lt;/strong&gt;&lt;/p&gt;&lt;p align="right" class="MsoNormal"&gt;&lt;strong&gt;实现网络媒体的流畅实时播放&lt;/strong&gt;&lt;/p&gt;&lt;p align="right" class="MsoNormal"&gt;&lt;strong&gt;之简单演示&lt;/strong&gt;&lt;/p&gt;&lt;p align="right" class="MsoNormal"&gt;&lt;strong&gt;(StreamingDemo)&lt;/strong&gt;&lt;/p&gt;&lt;p align="right" class="MsoNormal"&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;我的资源：&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-src-1.0.13.rar"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt;http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-src-1.0.13.rar&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;这个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;1.0.13&lt;/span&gt;&lt;/span&gt;&lt;span&gt;版本是&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;j2me&lt;/span&gt;&lt;/span&gt;&lt;span&gt;流媒体播放思路的简单演示软件，并不是对现有的RTSP/MMS流媒体服务器的客户端实现，而是自定义算法下载来保证实时播放，可以在&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Nokia 7610&lt;/span&gt;&lt;/span&gt;&lt;span&gt;手机上真实运行。在手机上使用，请在选择连接点时选择“移动梦网”连接点。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;如果修改源代码中&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;CommandResources.java&lt;/span&gt;&lt;/span&gt;&lt;span&gt;中的&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;m_bCMWAPProxy&lt;/span&gt;&lt;/span&gt;&lt;span&gt;标志使之走&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;CMNET&lt;/span&gt;&lt;/span&gt;&lt;span&gt;通道，那么能够在&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Nokia S60&lt;/span&gt;&lt;/span&gt;&lt;span&gt;的模拟器上运行。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span style="font-size: 12pt;"&gt;本源代码的大致思路来自于我上次写的三篇讨论稿&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc/archive/2006/01/12/577347.aspx"&gt;&lt;span style="font-size: 12pt;"&gt;J2me&lt;span lang="EN-US"&gt;&lt;span lang="EN-US"&gt;流媒体技术实现讨论&lt;/span&gt;&lt;/span&gt;[1]&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc/archive/2006/01/15/580084.aspx"&gt;&lt;span style="font-size: 12pt;"&gt;J2me&lt;span lang="EN-US"&gt;&lt;span lang="EN-US"&gt;流媒体技术实现讨论&lt;/span&gt;&lt;/span&gt;[2]&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://blog.csdn.net/zhengyun_ustc/archive/2006/01/17/582121.aspx"&gt;&lt;span style="font-size: 12pt;"&gt;J2me&lt;span lang="EN-US"&gt;&lt;span lang="EN-US"&gt;流媒体技术实现讨论&lt;/span&gt;&lt;/span&gt;[3] &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;，&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;StreamingDemo&lt;/span&gt;&lt;/span&gt;&lt;span&gt;的代码你可以借鉴，但不得用于商业用途，除非得到我的授权。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;手机jar安装包下载： &lt;br/&gt;&lt;a class="jive-link-external-small" href="http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-deployed.rar"&gt;http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-deployed.rar&lt;/a&gt;&lt;span&gt; &lt;/span&gt;&lt;br/&gt;可以将这个包中的StreamingDemo.jar传到您的手机上进行安装。 &lt;br/&gt;使用时，请选择移动梦网连接点。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span style="font-size: 12pt;"&gt;如果你想使用劈分好的媒体文件，请从&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a class="jive-link-external-small" href="http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-src-1.0.13.rar"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt;http://www.cnblogs.com/Files/zhengyun_ustc/changjin.split.rar&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 12pt;"&gt;下载。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;背景、功能&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p class="MsoNormalIndent"&gt;&lt;strong&gt;摘要&lt;/strong&gt;&lt;span&gt;：本章&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;简单描述&lt;/span&gt;&lt;strong&gt;StreamingDemo&lt;/strong&gt;&lt;span&gt;的背景、功能。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;1.1. &lt;/span&gt;&lt;span&gt;手机上的流媒体&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span&gt;很多人都在&lt;/span&gt;&lt;span lang="EN-US"&gt;j2medev.com&lt;/span&gt;&lt;span&gt;上讨论过流媒体的实现方式。&lt;/span&gt;&lt;span&gt;国外有一个人提出一种思路，并且号称在&lt;/span&gt;&lt;strong&gt;Nokia6260&lt;/strong&gt;&lt;span lang="EN-US"&gt;[&lt;/span&gt;&lt;em&gt;相关数据：诺基亚&lt;/em&gt;&lt;em&gt; 6260 Nokia62602.0 (3.0436.0) SymbianOS7.0s Series602.1 ProfileMIDP-2.0 ConfigurationCLDC-1.0&lt;/em&gt;&lt;span lang="EN-US"&gt;]&lt;/span&gt;&lt;span&gt;运行了。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;strong&gt;当然我们这里说的不是对RTSP/MMS这种主流的流媒体服务器的客户端实现，因为现在中国市场的很多很多手机的Java环境都不支持这两个协议，只有新出的某些手机才内置支持这一功能。&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;strong&gt;我们这次讲的是，在现有GPRS环境下，在现有的一两千块钱的手机条件下，如何做到流媒体实时播放呢，而且还能做到较为流畅呢？&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span lang="EN-US"&gt;2006&lt;/span&gt;&lt;span&gt;年&lt;/span&gt;&lt;span lang="EN-US"&gt;1&lt;/span&gt;&lt;span&gt;月份，我&lt;/span&gt;恰巧看到了&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span&gt;就此思路和诸位高手讨论了一下，并且写了三篇讨论稿，有了大致的思路。但一直都没有时间去测试这个思路是否可行。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span&gt;今天索性抽出了一两个小时，把这个思路写出来放在真实手机&lt;/span&gt;&lt;span lang="EN-US"&gt;/GPRS&lt;/span&gt;&lt;span&gt;网络上测试，不敢独享，遂开放代码，希望借此抛砖引玉。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;这里给出&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;StreamingDemo&lt;/span&gt;&lt;/span&gt;&lt;span&gt;的界面，很简单，主要的线程操作和消息处理都在后台：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;&lt;a href="http://blog.csdn.net/images/blog_csdn_net/zhengyun_ustc/187902/r_Streaming.HttpConnection.JPG"&gt;&lt;img alt="Streaming.HttpConnection" id="ViewPicture.ascx_GalleryImage" src="http://blog.csdn.net/images/blog_csdn_net/zhengyun_ustc/187902/r_Streaming.HttpConnection.JPG"/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 12pt;"&gt;&lt;span&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Arial;"&gt;1.2. &lt;/span&gt;&lt;/span&gt;&lt;span&gt;我所谓流媒体的功能&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;以前我们谈过：&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;第一步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;声明两个&lt;/span&gt;&lt;span lang="EN-US"&gt;Player&lt;/span&gt;&lt;span&gt;，分别由两个独立的线程掌控着；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第二步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;HttpConnection&lt;/span&gt;&lt;span&gt;开始向服务器请求该&lt;/span&gt;&lt;span lang="EN-US"&gt;audio&lt;/span&gt;&lt;span&gt;文件的第一部分字节，我们定这次读取的字节数为&lt;/span&gt;&lt;span lang="EN-US"&gt;18KB&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第三步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;等第一部分数据到位后，&lt;/span&gt;&lt;span lang="EN-US"&gt;Player A&lt;/span&gt;&lt;span&gt;开始&lt;/span&gt;&lt;span lang="EN-US"&gt;realize&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span lang="EN-US"&gt;prefetch&lt;/span&gt;&lt;span&gt;，并开始播放；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第四步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;在&lt;/span&gt;&lt;span lang="EN-US"&gt;Player A&lt;/span&gt;&lt;span&gt;播放同时，&lt;/span&gt;&lt;span lang="EN-US"&gt;(18KB&lt;/span&gt;&lt;span&gt;的&lt;/span&gt;&lt;span lang="EN-US"&gt;amr&lt;/span&gt;&lt;span&gt;数据可以播放&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span&gt;秒钟&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span&gt;，&lt;/span&gt;&lt;span lang="EN-US"&gt;HttpConnection&lt;/span&gt;&lt;span&gt;继续请求第二部分数据&lt;/span&gt;&lt;span lang="EN-US"&gt;(&lt;/span&gt;&lt;span&gt;假设&lt;/span&gt;&lt;span lang="EN-US"&gt;GPRS&lt;/span&gt;&lt;span&gt;每秒钟传输&lt;/span&gt;&lt;span lang="EN-US"&gt;3KB&lt;/span&gt;&lt;span&gt;，那么&lt;/span&gt;&lt;span lang="EN-US"&gt;18KB&lt;/span&gt;&lt;span&gt;需要传输&lt;/span&gt;&lt;span lang="EN-US"&gt;6&lt;/span&gt;&lt;span&gt;秒，算上前后通讯损失的时间，应该不会超过&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span&gt;秒钟&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第五步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第二部分数据到位后，假设&lt;/span&gt;&lt;span lang="EN-US"&gt;Player A&lt;/span&gt;&lt;span&gt;还没有播放完&lt;/span&gt;&lt;span lang="EN-US"&gt;(&lt;/span&gt;&lt;span&gt;这需要调整你的每一部份数据字节数来使得假设成立&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span&gt;，那么将数据喂给&lt;/span&gt;&lt;span lang="EN-US"&gt;Player B&lt;/span&gt;&lt;span&gt;让它&lt;/span&gt;&lt;span lang="EN-US"&gt;realize&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span lang="EN-US"&gt;prefetch&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;第六步：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;Player A&lt;/span&gt;&lt;span&gt;播放完后，得到事件通知，于是让&lt;/span&gt;&lt;span lang="EN-US"&gt;Player B&lt;/span&gt;&lt;span&gt;开始播放。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;如此往复。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;大致的思路就是这样。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;这次，我们起了两个线程，一个叫做“&lt;/span&gt;&lt;span lang="EN-US"&gt;Main(&lt;/span&gt;&lt;span&gt;主&lt;/span&gt;&lt;span lang="EN-US"&gt;) &lt;/span&gt;&lt;span&gt;”，一个叫做“&lt;/span&gt;&lt;span lang="EN-US"&gt;Secondary(&lt;/span&gt;&lt;span&gt;从属&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span&gt;”，他们都掌握着一个&lt;/span&gt;&lt;span lang="EN-US"&gt;Player&lt;/span&gt;&lt;span&gt;，同样一个是&lt;/span&gt;&lt;span lang="EN-US"&gt;Main Player&lt;/span&gt;&lt;span&gt;，一个是&lt;/span&gt;&lt;span lang="EN-US"&gt;Secondary Player&lt;/span&gt;&lt;span&gt;。这两个&lt;/span&gt;&lt;span lang="EN-US"&gt;Player&lt;/span&gt;&lt;span&gt;的操作实际上都被&lt;/span&gt;&lt;span lang="EN-US"&gt;Audio.java&lt;/span&gt;&lt;span&gt;类完全封装好了。线程里面仅仅是调用&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;Audio.prefetchSound(m_form,&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;                                             m_isInputMusic,&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;                                             m_Sequence);&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;啦，&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;Audio.playSound(m_Sequence);&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;啦，这样就可以把媒体资源预先运算以及播放了。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;同时，还必须用到&lt;/span&gt;&lt;span lang="EN-US"&gt;PlayerListener&lt;/span&gt;&lt;span&gt;接口，来得到播放器的各种事件通知，我们需要得知每一个播放器的播放结束消息，以便作出下一步选择：是让从属线程开始播放呢，还是让主线程开始播放呢。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;PlayerListener&lt;/span&gt;&lt;span&gt;的播放结束消息&lt;/span&gt;&lt;span lang="EN-US"&gt;(&lt;strong&gt;PlayerListener.END_OF_MEDIA&lt;/strong&gt;)&lt;/span&gt;&lt;span&gt;的处理中，我们还必须用到&lt;/span&gt;&lt;span lang="EN-US"&gt;MVC&lt;/span&gt;&lt;span&gt;模式中的&lt;/span&gt;&lt;span lang="EN-US"&gt;Controller&lt;/span&gt;&lt;span&gt;，它是代码中的&lt;/span&gt;&lt;span lang="EN-US"&gt;GUIController.java&lt;/span&gt;&lt;span&gt;，它负责处理几个消息：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;l&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;EventID.EVENT_MAIN_DownloadCompleted&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;l&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;EventID.EVENT_Main_BeginToPlay&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;l&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;EventID.EVENT_SECONDARY_BeginToPlay&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;怎么综合使用这些消息和事件呢？&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;比如说，当主线程的媒体文件下载完毕后，就应该通知&lt;/span&gt;&lt;span lang="EN-US"&gt;GUIController&lt;/span&gt;&lt;span&gt;让从属线程也开始下载并加载媒体文件。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;当主线程的媒体文件播放完毕了，这时候照理说从属线程的&lt;/span&gt;&lt;span lang="EN-US"&gt;Player&lt;/span&gt;&lt;span&gt;也已经预先加载好了下一个要播放的媒体文件&lt;/span&gt;&lt;span lang="EN-US"&gt;(&lt;/span&gt;&lt;span&gt;如果不行的话就应该调整媒体文件的大小了以使得下载时间和播放时间差不多&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span&gt;，就应该在&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;public void playerUpdate(Player player, String event, Object data)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;的函数处理中，让&lt;/span&gt;&lt;span lang="EN-US"&gt;Secondary Player&lt;/span&gt;&lt;span&gt;播放了。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;这次我们直接将媒体文件用讨论稿中谈及的&lt;/span&gt;&lt;span lang="EN-US"&gt;ffmpeg&lt;/span&gt;&lt;span&gt;自动切分的办法，已经辟成&lt;/span&gt;&lt;span lang="EN-US"&gt;11&lt;/span&gt;&lt;span&gt;小段的&lt;/span&gt;&lt;span lang="EN-US"&gt;AMR&lt;/span&gt;&lt;span&gt;文件了，每一个&lt;/span&gt;&lt;span lang="EN-US"&gt;AMR&lt;/span&gt;&lt;span&gt;文件都可以独立播放，连起来就是一首完整的《大长今》乐曲。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;PlayerA&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span lang="EN-US"&gt;PlayerB&lt;/span&gt;&lt;span&gt;只是周而复始的下载、预运算、播放他们罢了。只不过掌控着&lt;/span&gt;&lt;span lang="EN-US"&gt;Player&lt;/span&gt;&lt;span&gt;的两个线程和主控制器，会选择时机来让这些操作次第展开。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;上面所说的逻辑，可以用下图表示：&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://static.flickr.com/48/119270221_22b37c5793.jpg"&gt;&lt;img src="http://static.flickr.com/48/119270221_22b37c5793.jpg"/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;span lang="EN-US"&gt;&lt;h1&gt;&lt;span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;2 &lt;/span&gt;使用感受&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p class="MsoNormalIndent"&gt;&lt;strong&gt;摘要&lt;/strong&gt;&lt;span&gt;：本章&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;简单描述&lt;/span&gt;&lt;strong&gt;StreamingDemo&lt;/strong&gt;&lt;strong&gt;在真实&lt;/strong&gt;&lt;strong&gt;GPRS&lt;/strong&gt;&lt;strong&gt;环境下&lt;/strong&gt;&lt;span&gt;的使用感受。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Arial;"&gt;2.1. Nokia7610&lt;/span&gt;&lt;/span&gt;&lt;span&gt;手机上的设置&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;如果你真的要在手机上用到这种功能，那么请申请开通你的&lt;/span&gt;&lt;span lang="EN-US"&gt;GPRS&lt;/span&gt;&lt;span&gt;包月套餐，那样&lt;/span&gt;&lt;span lang="EN-US"&gt;20&lt;/span&gt;&lt;span&gt;块钱就可以使用&lt;/span&gt;&lt;span lang="EN-US"&gt;50MB&lt;/span&gt;&lt;span&gt;流量的&lt;/span&gt;&lt;span lang="EN-US"&gt;GPRS&lt;/span&gt;&lt;span&gt;了。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;如果你的手机是&lt;/span&gt;&lt;strong&gt;Nokia&lt;/strong&gt;&lt;span&gt;的&lt;/span&gt;&lt;span lang="EN-US"&gt;S60&lt;/span&gt;&lt;span&gt;系列手机，建议用&lt;/span&gt;&lt;strong&gt;Nokia&lt;/strong&gt;&lt;strong&gt;程序管理器&lt;/strong&gt;&lt;span&gt;设置这个应用配置一个参数：&lt;strong&gt;在连接网络时第一次询问&lt;/strong&gt;。否则你会屡屡被网络连接警告框打断的。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: Arial;"&gt;2.2. Nokia7610&lt;/span&gt;&lt;/span&gt;&lt;span&gt;手机上的使用感受&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;这种流媒体的播放，还是取决于使用时&lt;/span&gt;&lt;span lang="EN-US"&gt;GPRS&lt;/span&gt;&lt;span&gt;网络的好坏。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;我在晚上&lt;/span&gt;&lt;span lang="EN-US"&gt;19&lt;/span&gt;&lt;span&gt;点使用了一下，感觉比较流畅，甚至超乎我的预期，不认真听，甚至感觉不到在哪里停顿的。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span&gt;但是在晚上&lt;/span&gt;&lt;span lang="EN-US"&gt;20&lt;/span&gt;&lt;span&gt;点又用了一下，就有点拖拖拉拉的，延迟较为明显。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormalIndent"&gt;&lt;span&gt;可见现行的&lt;/span&gt;&lt;span lang="EN-US"&gt;GPRS&lt;/span&gt;&lt;span&gt;网络环境还是容易出现拥挤的。&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;3 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;开源版权声明&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;由于这个&lt;strong&gt;手机流媒体简单演示&lt;/strong&gt;的&lt;/span&gt;&lt;span&gt;思路和代码来自于郑昀以前的讨论稿，今为了促进&lt;/span&gt;&lt;span lang="EN-US"&gt;J2ME&lt;/span&gt;&lt;span&gt;多媒体应用发展，&lt;span&gt;决定遵照&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;GPL&lt;/span&gt;&lt;span&gt;协议的大意开放源代码，您可以自由传播和修改，在遵照下面的约束条件的前提下：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" width="94%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="624"&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;条件&lt;/strong&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="624"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;只要你在&lt;/span&gt;&lt;span&gt;&lt;span style="font-family: 'Times New Roman';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;strong&gt;手机流媒体简单演示&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;span&gt;的&lt;/span&gt;&lt;span&gt;每一副本上明显和恰当地出版版权声明，保持此许可证的声明和没有担保的声明完整无损，并和程序一起给每个其他的程序接受者一份许可证的副本，你就可以用任何媒体复制和发布你收到的原始的程序的源代码。你可以为转让副本的实际行动收取一定费用，但必须事先得到郑昀的同意。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoNormalTable" width="94%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="624"&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;条件&lt;/strong&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="624"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;你可以修改&lt;/span&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;手机流媒体简单演示&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;span&gt;程序的一个或几个副本或程序的任何部分，以此形成基于程序的作品。只要你同时满足下面的所有条件，你就可以按前面第一款的要求复制和发布这一经过修改的程序或作品。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;你必须在修改的文件中附有明确的说明：你修改了这一文件及具体的修改日期。&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;你必须使你发布或出版的作品（它包含程序的全部或一部分，或包含由程序的全部或部分衍生的作品）允许第三方作为整体按许可证条款免费使用。&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;如果修改的程序在运行时以交互方式读取命令，你必须使它在开始进入常规的交互使用方式时打印或显示声明：包括适当的版权声明和没有担保的声明（或者你提供担保的声明）；用户可以按此许可证条款重新发布程序的说明；并告诉用户如何看到这一许可证的副本。（例外的情况：如果原始程序以交互方式工作，它并不打印这样的声明，你的基于程序的作品也就不用打印声明）。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;这样，您就可以自由使用并传播本源代码，&lt;strong&gt;当然请您原封不动地保留创建者&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;zhengyun_ustc(&lt;/strong&gt;&lt;strong&gt;郑昀&lt;/strong&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;strong&gt;的作者信息&lt;/strong&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:bfcf5df4-d624-4c74-96f4-c845fda59a7b] --&gt;</description>
      <pubDate>Fri, 20 Nov 2009 11:42:52 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3331</guid>
      <dc:date>2009-11-20T11:42:52Z</dc:date>
      <clearspace:dateToText>1 day, 20 hours ago</clearspace:dateToText>
    </item>
    <item>
      <title>Java Verified 手册</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3329</link>
      <description>&lt;!-- [DocumentBodyStart:107ca524-0eed-4d70-9369-961393bec462] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;    本手册将逐步指导您实现，如何通过 Java Verified 提交门户网站提交应用软件进行认证，并简要介绍提交门户网站能为已提交的软件提供哪些服务。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;    它将带您通过认证流程涉及的所有步骤，包括从获取 Publisher ID 到最终在线提交应用软件进行测试与签名。&lt;/span&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;目录&lt;/span&gt;&lt;/strong&gt;&lt;br/&gt;1. 本手册的用途&lt;br/&gt;2. 什么是 Java Verified 提交门户网站？&lt;br/&gt;3. 什么是 Publisher ID？我该如何使用它？&lt;br/&gt;4. 我该如何注册使用提交门户网站？&lt;br/&gt;5. 在提交应用软件之前我需要做些什么？&lt;br/&gt;6. 我该如何将应用软件提交到门户网站？&lt;br/&gt;7. 我该如何提交应用软件进行研发签名？&lt;br/&gt;8. 我该如何提交应用软件进行测试与签名？&lt;br/&gt;9. 我该如何在门户网站上找到提交的内容？&lt;br/&gt;附录 A: 签署多个 JAD / JAR 文件对的脚本示例&lt;br/&gt;附录 B: 常见问题解答&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;关于如何在索尼爱立信手机上进行 Java 签名和 Java 的权限设置，请阅读下面的文章&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;a class="jive-link-wiki-small" href="http://developer.sonyericsson.com/community/docs/DOC-3059"&gt;索尼爱立信手机 Java ME 签名指南&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="jive-link-wiki-small" href="http://developer.sonyericsson.com/community/docs/DOC-3018"&gt;索尼爱立信手机的 Java ME 的权限设置&lt;/a&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;更多信息&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;a class="jive-link-external-small" href="http://developer.sonyericsson.com/site/zhcn/techsupport/javaverified/p_javaverified.jsp"&gt;http://developer.sonyericsson.com/site/zhcn/techsupport/javaverified/p_javaverified.jsp&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="jive-link-external-small" href="http://www.javaverified.com"&gt;http://www.javaverified.com&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:107ca524-0eed-4d70-9369-961393bec462] --&gt;</description>
      <pubDate>Tue, 17 Nov 2009 09:30:37 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3329</guid>
      <dc:date>2009-11-17T09:30:37Z</dc:date>
      <clearspace:dateToText>4 days, 22 hours ago</clearspace:dateToText>
    </item>
    <item>
      <title>How to update a SonyEricsson S60 phone with new firmware</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3219</link>
      <description>&lt;!-- [DocumentBodyStart:92a6a397-61f9-4704-9fd0-0d1a29d2ac3d] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;&lt;!----&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;How to update a Sony Ericsson S60 device with new updated firmware&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;Developers with EMMA access may have the ability to update their Sony Ericsson device firmware&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;On Sony Ericsson S60 devices the procedure is a little different than Sony Ericsson JP-X phones. &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;Prerequisites:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="text-indent: -18pt;"&gt;&lt;!----&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;&lt;span&gt;-&lt;span style="font-family: &amp;amp;quot;Times New Roman&amp;amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!----&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;PC with Emma PC Software tool installed&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="text-indent: -18pt;"&gt;&lt;!----&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;&lt;span&gt;-&lt;span style="font-family: &amp;amp;quot;Times New Roman&amp;amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!----&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;Valid Emma3 username&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="text-indent: -18pt;"&gt;&lt;!----&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;&lt;span&gt;-&lt;span style="font-family: &amp;amp;quot;Times New Roman&amp;amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!----&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;Sony Ericsson S60 device with a charged battery&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="text-indent: -18pt;"&gt;&lt;!----&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;&lt;span&gt;-&lt;span style="font-family: &amp;amp;quot;Times New Roman&amp;amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!----&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;Sony Ericsson USB to phone system cable, connected to the PC&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;Steps:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;1. Start the Emma PC Software tool&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;    Start -&amp;gt; Programs-&amp;gt; Sony Ericsson -&amp;gt; Emma -&amp;gt;Emma&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;2. Remove the battery from the device&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;3. Note the prototype build on the white paper label behind the battery&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;Note: The information here in step #3 will be used when selecting the correct firmware from Emma PC Software tool&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;4. Insert the battery back into the phone&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;5. Hold down the Green “SEND” Key Button then plug the Sony Ericsson Device into the PC via the USB system cable&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;6. Wait until Emma PC Software tool recognizes the phone. This may take up to 30 seconds&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;7. Use "server search" option within the Emma PC Software tool to locate the correct S60 firmware&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;   &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;Note: Select a firmware version matching the hardware prototype build found in step #3&lt;/strong&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;8. Attach the firmware (service EMMA calls it...) to the phone by pressing the button in Emma&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;9. Wait until Emma PC Software tool has finished downloading the associated firmware to the Sony Ericsson device.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;10. Unplug the USB cable from the Sony Ericsson device&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt;11. Power on Sony Ericsson device. This may take several minutes to complete the customization process&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 9pt; color: #333333;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:92a6a397-61f9-4704-9fd0-0d1a29d2ac3d] --&gt;</description>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=?14&amp;container=2087">s60</category>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=?14&amp;container=2087">satio</category>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=?14&amp;container=2087">firmware</category>
      <pubDate>Mon, 21 Sep 2009 07:41:25 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3219</guid>
      <dc:date>2009-09-21T07:41:25Z</dc:date>
      <clearspace:dateToText>5 days, 36 minutes ago</clearspace:dateToText>
    </item>
    <item>
      <title>Proposed work flow when developing in Java for Sony Ericsson S60</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3325</link>
      <description>&lt;!-- [DocumentBodyStart:c080aa8d-a48c-4acb-8d85-40f9ebdc7e45] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;h3&gt;Introduction&lt;/h3&gt;&lt;p&gt;This is a proposed workflow for developing Java applicaion for Sony Ericsson S60 handsets.&lt;/p&gt;&lt;h3&gt;Description&lt;/h3&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;0. Develop and test your application. &lt;img height="16px" src="http://developer.sonyericsson.com/community/images/emoticons/happy.gif" width="16px"/&gt;&lt;/p&gt;&lt;p&gt;1. Apply for UID from &lt;a class="jive-link-external-small" href="https://www.symbiansigned.com/app/page"&gt;Symbian signed site&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;2. Add unprotected UID in Jad and manifest.mf file. (The manifest.mf file will be automagically updated if the "jad-template" in the project is updated and the project is recompiled)&lt;/p&gt;&lt;p&gt;3. Test the application.&lt;/p&gt;&lt;p&gt;4. Update the UID to protected range.&lt;/p&gt;&lt;p&gt;5. Send the application to &lt;a class="jive-link-external-small" href="http://developer.sonyericsson.com/site/global/techsupport/javaverified/p_javaverified.jsp"&gt;Java verified&lt;/a&gt;.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;Information.&lt;/h4&gt;&lt;p&gt;More information on UIDs can be found &lt;a class="jive-link-wiki-small" href="http://developer.sonyericsson.com/community/docs/DOC-3317"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Good Luck&lt;/p&gt;&lt;p&gt;Sony Ericsson Developer support&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:c080aa8d-a48c-4acb-8d85-40f9ebdc7e45] --&gt;</description>
      <pubDate>Thu, 12 Nov 2009 11:18:28 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3325</guid>
      <dc:date>2009-11-12T11:18:28Z</dc:date>
      <clearspace:dateToText>1 week, 2 days ago</clearspace:dateToText>
    </item>
    <item>
      <title>UIDs for JAD and JAR files on S60 platforms.</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3317</link>
      <description>&lt;!-- [DocumentBodyStart:0af34624-b582-48bd-9bbd-ba237078bfcf] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;h3&gt;Introduction&lt;/h3&gt;&lt;p&gt;There has been some problems regarding how and when a UID is to be requested on JAD and JAR files for Symbian.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The predefined UID attribute must be present in the JAD file for MIDlets using  the predefined UID when starting the installation from the application  descriptor (JAD) and also in the JAR Manifest file.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;Description&lt;/h3&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;MIDlet can have a predefined UID attribute in the same way as native  executables.This is  accomplished using a new JAD/JAR manifest attribute Nokia-MIDlet-UID-&amp;lt;n&amp;gt;,  where &amp;lt;n&amp;gt; stands for the MIDlet's number inside the MIDlet suite as with  some other attributes.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;The UID can be from the following ranges:&lt;/p&gt;&lt;p&gt;0x20000000-0x2FFFFFFF: "protected range", to use this the application must be  signed and the attribute must be in the JAR manifest file. The UIDs in this  range are requested from Symbian Signed.&lt;/p&gt;&lt;p&gt;0xA0000000-0xAFFFFFFF: "unprotected range", the UIDs in this range should  also be requested from Symbian Signed.&lt;/p&gt;&lt;p&gt;0xE0000000-0xEFFFFFFF: "development use range", the UIDs in this range can be  used freely but collisions may happen.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;However, when the installation of a MIDlet with a predefined UID is  started from JAD or JAR Manifest, the actual installation result varies between  unprotected and protected ranges. The importance of JAD is here  especially highlighted since installation is normally started from JAD.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A predefined UID is useful in the following cases:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;A native application can launch the MIDlet easily using the MIDlet's UID.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pre-installed MIDlets can be shown in Active Idle shortcut. A pre-installed  MIDlet requires a pre-defined UID.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Pre-defined UIDs are assigned with the  &lt;code&gt;Nokia-MIDlet-UID-&amp;lt;n&amp;gt;&lt;/code&gt; JAD attribute, where  &lt;code&gt;&amp;lt;n&amp;gt;&lt;/code&gt; is the MIDlet's identifier in the JAD file and JAR file manifest.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;How request a UID&lt;/h3&gt;&lt;p&gt;You request a UID for your application on symbian signed.&lt;/p&gt;&lt;p&gt;&lt;a class="jive-link-external-small" href="https://www.symbiansigned.com/app/page"&gt;https://www.symbiansigned.com/app/page&lt;/a&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;When you have received a UID&lt;/h4&gt;&lt;p&gt;When you have received a UID it will look like:&lt;/p&gt;&lt;p&gt;&lt;!----&gt;&lt;span style="font-size: 11pt; font-family: &amp;amp;quot;Calibri&amp;amp;quot;,&amp;amp;quot;sans-serif&amp;amp;quot;;"&gt;Nokia-MIDlet-UID-1:0x2002B0CC&lt;/span&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Add the UID in the JAD file and in the manifest.mf. (The manifest.mf will be automagically updated if the project is recompiled.)&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;More information&lt;/h4&gt;&lt;p&gt;Can be found in this &lt;a class="jive-link-external-small" href="http://wiki.forum.nokia.com/index.php/TSJ000995_-_Predefined_UID_attribute_must_be_present_in_both_JAD_and_JAR_files"&gt;article &lt;/a&gt;and also &lt;a class="jive-link-external-small" href="http://library.forum.nokia.com/index.jsp?topic=/Java_Developers_Library/GUID-C5D3E0F5-72B9-4EE7-8BA7-20DE4A538FB9.html"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Good luck&lt;/p&gt;&lt;p&gt;Sony Ericsson Developer support&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:0af34624-b582-48bd-9bbd-ba237078bfcf] --&gt;</description>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=?14&amp;container=2087">s60</category>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=?14&amp;container=2087">symbian</category>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=?14&amp;container=2087">javame</category>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=?14&amp;container=2087">uid</category>
      <pubDate>Fri, 06 Nov 2009 11:52:17 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3317</guid>
      <dc:date>2009-11-06T11:52:17Z</dc:date>
      <clearspace:dateToText>1 week, 2 days ago</clearspace:dateToText>
    </item>
    <item>
      <title>Java线程的同步</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3323</link>
      <description>&lt;!-- [DocumentBodyStart:fe440b7f-7a7a-4bb8-84d1-b6976e30c9bd] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;在J2ME开发中，线程是一个需要非常重视的问题，下面是一段关于线程的文章。我认为对打好线程基本很有帮助。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;zz &lt;/span&gt;&lt;a class="jive-link-external-small" href="http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=5478"&gt;http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=5478&lt;/a&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;div align="left"&gt;&lt;strong&gt;一、同步问题提出&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;线程的同步是为了防止多个线程访问一个数据对象时，对数据造成的破坏。&lt;/div&gt;&lt;div align="left"&gt;例如：两个线程ThreadA、ThreadB都操作同一个对象Foo对象，并修改Foo对象上的数据。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Foo { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x = 100; &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; getX() { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; x; &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; fix(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; y) { &lt;br/&gt;        x = x - y; &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; x; &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MyRunnable &lt;span style="color: #0000ff;"&gt;implements&lt;/span&gt; Runnable { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Foo foo = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Foo(); &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; main(String[] args) { &lt;br/&gt;        MyRunnable r = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MyRunnable(); &lt;br/&gt;        Thread ta = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(r, &lt;span style="color: #800000;"&gt;"Thread-A"&lt;/span&gt;); &lt;br/&gt;        Thread tb = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(r, &lt;span style="color: #800000;"&gt;"Thread-B"&lt;/span&gt;); &lt;br/&gt;        ta.start(); &lt;br/&gt;        tb.start(); &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; run() { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 3; i++) { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.fix(30); &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; { &lt;br/&gt;                Thread.sleep(1); &lt;br/&gt;            } &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (InterruptedException e) { &lt;br/&gt;                e.printStackTrace(); &lt;br/&gt;            } &lt;br/&gt;            System.out.println(Thread.currentThread().getName() + &lt;span style="color: #800000;"&gt;" : 当前foo对象的x值= "&lt;/span&gt; + foo.getX()); &lt;br/&gt;        } &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; fix(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; y) { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; foo.fix(y); &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;运行结果：&lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;Thread-A : 当前foo对象的x值= 40 &lt;br/&gt;Thread-B : 当前foo对象的x值= 40 &lt;br/&gt;Thread-B : 当前foo对象的x值= -20 &lt;br/&gt;Thread-A : 当前foo对象的x值= -50 &lt;br/&gt;Thread-A : 当前foo对象的x值= -80 &lt;br/&gt;Thread-B : 当前foo对象的x值= -80 &lt;br/&gt;&lt;br/&gt;Process finished with exit code 0&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;从结果发现，这样的输出值明显是不合理的。原因是两个线程不加控制的访问Foo对象并修改其数据所致。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;如果要保持结果的合理性，只需要达到一个目的，就是将对Foo的访问加以限制，每次只能有一个线程在访问。这样就能保证Foo对象中数据的合理性了。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;在具体的Java代码中需要完成一下两个操作：&lt;/div&gt;&lt;div align="left"&gt;把竞争访问的资源类Foo变量x标识为private；&lt;/div&gt;&lt;div align="left"&gt;同步哪些修改变量的代码，使用synchronized关键字同步方法或代码。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;二、同步和锁定&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;1、锁的原理&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;Java中每个对象都有一个内置锁&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;当程序运行到非静态的synchronized同步方法上时，自动获得与正在执行代码类的当前实例（this实例）有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;当程序运行到synchronized同步方法或代码块时才该对象锁才起作用。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;一个对象只有一个锁。所以，如果一个线程获得该锁，就没有其他线程可以获得锁，直到第一个线程释放（或返回）锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块，直到该锁被释放。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;释放锁是指持锁线程退出了synchronized同步方法或代码块。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;关于锁和同步，有一下几个要点：&lt;/div&gt;&lt;div align="left"&gt;1）、只能同步方法，而不能同步变量和类；&lt;/div&gt;&lt;div align="left"&gt;2）、每个对象只有一个锁；当提到同步时，应该清楚在什么上同步？也就是说，在哪个对象上同步？&lt;/div&gt;&lt;div align="left"&gt;3）、不必同步类中所有的方法，类可以同时拥有同步和非同步方法。&lt;/div&gt;&lt;div align="left"&gt;4）、如果两个线程要执行一个类中的synchronized方法，并且两个线程使用相同的实例来调用方法，那么一 次只能有一个线程能够执行方法，另一个需要等待，直到锁被释放。也就是说：如果一个线程在对象上获得一个锁，就没有任何其他线程可以进入（该对象的）类中 的任何一个同步方法。&lt;/div&gt;&lt;div align="left"&gt;5）、如果线程拥有同步和非同步方法，则非同步方法可以被多个线程自由访问而不受锁的限制。&lt;/div&gt;&lt;p align="left"&gt;6）、线程睡眠时，它所持的任何锁都不会释放。&lt;/p&gt;&lt;div align="left"&gt;7）、线程可以获得多个锁。比如，在一个对象的同步方法里面调用另外一个对象的同步方法，则获取了两个对象的同步锁。&lt;/div&gt;&lt;div align="left"&gt;8）、同步损害并发性，应该尽可能缩小同步范围。同步不但可以同步整个方法，还可以同步方法中一部分代码块。&lt;/div&gt;&lt;div align="left"&gt;9）、在使用同步代码块时候，应该指定在哪个对象上同步，也就是说要获取哪个对象的锁。例如：&lt;/div&gt;&lt;div align="left"&gt;    public int fix(int y) {&lt;br/&gt;        synchronized (this) {&lt;br/&gt;            x = x - y;&lt;br/&gt;        }&lt;br/&gt;        return x;&lt;br/&gt;    }&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;当然，同步方法也可以改写为非同步方法，但功能完全一样的，例如：&lt;/div&gt;&lt;div align="left"&gt;    public synchronized int getX() {&lt;br/&gt;        return x++;&lt;br/&gt;    }&lt;/div&gt;&lt;div align="left"&gt;与&lt;/div&gt;&lt;div align="left"&gt;    public int getX() {&lt;br/&gt;        synchronized (this) {&lt;br/&gt;            return x;&lt;br/&gt;        }&lt;br/&gt;    }&lt;/div&gt;&lt;div align="left"&gt;效果是完全一样的。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;三、静态方法同步&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;要同步静态方法，需要一个用于整个类对象的锁，这个对象是就是这个类（XXX.class)。&lt;/div&gt;&lt;div align="left"&gt;例如：&lt;/div&gt;&lt;div align="left"&gt;public static synchronized int setName(String name){&lt;/div&gt;&lt;div align="left"&gt;      Xxx.name = name;&lt;/div&gt;&lt;div align="left"&gt;}&lt;/div&gt;&lt;div align="left"&gt;等价于&lt;br/&gt;public static int setName(String name){&lt;br/&gt;      synchronized(Xxx.class){&lt;br/&gt;            Xxx.name = name;&lt;br/&gt;      }&lt;br/&gt;}&lt;/div&gt;&lt;div align="left"&gt;&lt;br/&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;四、如果线程不能不能获得锁会怎么样&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;如果线程试图进入同步方法，而其锁已经被占用，则线程在该对象上被阻塞。实质上，线程进入该对象的的一种池中，必须在哪里等待，直到其锁被释放，该线程再次变为可运行或运行为止。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;当考虑阻塞时，一定要注意哪个对象正被用于锁定：&lt;/div&gt;&lt;div align="left"&gt;1、调用同一个对象中非静态同步方法的线程将彼此阻塞。如果是不同对象，则每个线程有自己的对象的锁，线程间彼此互不干预。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;2、调用同一个类中的静态同步方法的线程将彼此阻塞，它们都是锁定在相同的Class对象上。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;3、静态同步方法和非静态同步方法将永远不会彼此阻塞，因为静态方法锁定在Class对象上，非静态方法锁定在该类的对象上。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;4、对于同步代码块，要看清楚什么对象已经用于锁定（synchronized后面括号的内容）。在同一个对象上进行同步的线程将彼此阻塞，在不同对象上锁定的线程将永远不会彼此阻塞。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;五、何时需要同步&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;在多个线程同时访问互斥（可交换）数据时，应该同步以保护数据，确保两个线程不会同时修改更改它。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;对于非静态字段中可更改的数据，通常使用非静态方法访问。&lt;/div&gt;&lt;div align="left"&gt;对于静态字段中可更改的数据，通常使用静态方法访问。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;如果需要在非静态方法中使用静态字段，或者在静态字段中调用非静态方法，问题将变得非常复杂。已经超出SJCP考试范围了。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;六、线程安全类&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;当一个类已经很好的同步以保护它的数据时，这个类就称为“线程安全的”。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;即使是线程安全类，也应该特别小心，因为操作的线程是间仍然不一定安全。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;举个形象的例子，比如一个集合是线程安全的，有两个线程在操作同一个集合对象，当第一个线程查询集合非空后，删除集 合中所有元素的时候。第二个线程也来执行与第一个线程相同的操作，也许在第一个线程查询后，第二个线程也查询出集合非空，但是当第一个执行清除后，第二个 再执行删除显然是不对的，因为此时集合已经为空了。&lt;/div&gt;&lt;div align="left"&gt;看个代码：&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; NameList { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; List nameList = Collections.synchronizedList(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; LinkedList()); &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; add(String name) { &lt;br/&gt;        nameList.add(name); &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; String removeFirst() { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (nameList.size() &amp;gt; 0) { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (String) nameList.remove(0); &lt;br/&gt;        } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;; &lt;br/&gt;        } &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Test { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; main(String[] args) { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; NameList nl = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; NameList(); &lt;br/&gt;        nl.add(&lt;span style="color: #800000;"&gt;"aaa"&lt;/span&gt;); &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; NameDropper &lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt; Thread{ &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; run(){ &lt;br/&gt;                String name = nl.removeFirst(); &lt;br/&gt;                System.out.println(name); &lt;br/&gt;            } &lt;br/&gt;        } &lt;br/&gt;&lt;br/&gt;        Thread t1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; NameDropper(); &lt;br/&gt;        Thread t2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; NameDropper(); &lt;br/&gt;        t1.start(); &lt;br/&gt;        t2.start(); &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;虽然集合对象&lt;/div&gt;&lt;div align="left"&gt;    private List nameList = Collections.synchronizedList(new LinkedList());&lt;br/&gt;是同步的，但是程序还不是线程安全的。&lt;/div&gt;&lt;div align="left"&gt;出现这种事件的原因是，上例中一个线程操作列表过程中无法阻止另外一个线程对列表的其他操作。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;解决上面问题的办法是，在操作集合对象的NameList上面做一个同步。改写后的代码如下：&lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; NameList { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; List nameList = Collections.synchronizedList(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; LinkedList()); &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; add(String name) { &lt;br/&gt;        nameList.add(name); &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; String removeFirst() { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (nameList.size() &amp;gt; 0) { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (String) nameList.remove(0); &lt;br/&gt;        } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;; &lt;br/&gt;        } &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;这样，当一个线程访问其中一个同步方法时，其他线程只有等待。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;七、线程死锁&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;死锁对Java程序来说，是很复杂的，也很难发现问题。当两个线程被阻塞，每个线程在等待另一个线程时就发生死锁。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;还是看一个比较直观的死锁例子：&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;div style="border: 1px solid #cccccc; padding: 4px; font-size: 10pt; width: 98%; color: #000000; line-height: 16px; font-family: verdana,宋体; background-color: #eeeeee;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; DeadlockRisk { &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Resource { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; value; &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Resource resourceA = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Resource(); &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Resource resourceB = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Resource(); &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; read() { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; (resourceA) { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; (resourceB) { &lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; resourceB.value + resourceA.value; &lt;br/&gt;            } &lt;br/&gt;        } &lt;br/&gt;    } &lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; write(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b) { &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; (resourceB) { &lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;synchronized&lt;/span&gt; (resourceA) { &lt;br/&gt;                resourceA.value = a; &lt;br/&gt;                resourceB.value = b; &lt;br/&gt;            } &lt;br/&gt;        } &lt;br/&gt;    } &lt;br/&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;假设read()方法由一个线程启动，write()方法由另外一个线程启动。读线程将拥有resourceA锁，写线程将拥有resourceB锁，两者都坚持等待的话就出现死锁。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;实际上，上面这个例子发生死锁的概率很小。因为在代码内的某个点，CPU必须从读线程切换到写线程，所以，死锁基本上不能发生。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;但是，无论代码中发生死锁的概率有多小，一旦发生死锁，程序就死掉。有一些设计方法能帮助避免死锁，包括始终按照预定义的顺序获取锁这一策略。已经超出SCJP的考试范围。&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;八、线程同步小结&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;1、线程同步的目的是为了保护多个线程反问一个资源时对资源的破坏。&lt;/div&gt;&lt;div align="left"&gt;2、线程同步方法是通过锁来实现，每个对象都有切仅有一个锁，这个锁与一个特定的对象关联，线程一旦获取了对象锁，其他访问该对象的线程就无法再访问该对象的其他非同步方法。&lt;/div&gt;&lt;div align="left"&gt;3、对于静态同步方法，锁是针对这个类的，锁对象是该类的Class对象。静态和非静态方法的锁互不干预。一个线程获得锁，当在一个同步方法中访问另外对象上的同步方法时，会获取这两个对象锁。&lt;/div&gt;&lt;div align="left"&gt;4、对于同步，要时刻清醒在哪个对象上同步，这是关键。&lt;/div&gt;&lt;div align="left"&gt;5、编写线程安全的类，需要时刻注意对多个线程竞争访问资源的逻辑和安全做出正确的判断，对“原子”操作做出分析，并保证原子操作期间别的线程无法访问竞争资源。&lt;/div&gt;&lt;div align="left"&gt;6、当多个线程等待一个对象锁时，没有获取到锁的线程将发生阻塞。&lt;/div&gt;&lt;div align="left"&gt;7、死锁是线程间相互等待锁锁造成的，在实际中发生的概率非常的小。真让你写个死锁程序，不一定好使，呵呵。但是，一旦程序发生死锁，程序将死掉。&lt;/div&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:fe440b7f-7a7a-4bb8-84d1-b6976e30c9bd] --&gt;</description>
      <pubDate>Wed, 11 Nov 2009 01:38:50 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3323</guid>
      <dc:date>2009-11-11T01:38:50Z</dc:date>
      <clearspace:dateToText>1 week, 4 days ago</clearspace:dateToText>
    </item>
    <item>
      <title>智能手机安装软件常见问题与解决方法</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3321</link>
      <description>&lt;!-- [DocumentBodyStart:3f7a2ebb-4d1d-4cf8-bca2-f3dcb6461204] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;你使用的是不是智能手机？比如S60第2版？比如S60第3版的系统？N70？N72？N95？等等智能手机？当我 &lt;br/&gt;们给智能手机安装软件的时候，难免会遇到手机安装程序出错的情况，下面一起看看如何解决吧！ &lt;br/&gt;错误提示一：无法安装不被信任的提供商提供的受保护应用程序 &lt;br/&gt;问题说明：有几种可能引发此问题： &lt;br/&gt;1.手机设置问题 &lt;br/&gt;2.软件没有签名或者签名不正确 &lt;br/&gt;3.证书冲突． &lt;br/&gt;解决办法： &lt;br/&gt;1：进入手机的“程序管理”- “选项”-“设置”：“安装软件”设置成--全部，“在线证书检查”设置 &lt;br/&gt;成--关； &lt;br/&gt;2：将未签过名的软件重新签名后再安装； &lt;br/&gt;3 ：手机格机后再安装（注意格机前请作好备份） &lt;br/&gt;错误提示二：文件受损 &lt;br/&gt;问题说明：安装程序文件被破坏或者不完整，有可能是在程序下载或者解时引起的文件破坏． &lt;br/&gt;解决办法：请确定下载的程序文件是好的。建议再次下载（下载其他帖子里的）或解压缩程序再试。 &lt;br/&gt;错误提示三：无任何提示 &lt;br/&gt;问题说明：程序安装好后点其图标却无法运行，一般是中文文件名的JAR程序出现这种情况． &lt;br/&gt;解决办法：删除掉已经安装的JAR程序，将JAR程序文件名改为全英文之后再试。 &lt;br/&gt;错误提示四：手机启动失败 &lt;br/&gt;问题说明：一般是某个程序安装失败后重启手机时出现这个提有部分是升级机器时失败导致． &lt;br/&gt;解决办法：如果是某个程序安装失败，那么只需要将存储卡拿出来，然后再次启动机器。并将安装错误的 &lt;br/&gt;程序删除掉即可。 如果是手机升级后出现，那么就只有重新格机了。需要注意的是：一些开机启动并常 &lt;br/&gt;驻内存的软件是无法通过格式化解决的。所以，软格前先需要把这些软件全部关闭或删除。 &lt;br/&gt;错误提示五：此应用程序仅供开发之用，继续安装可能会导致你的设备出现严重问题 &lt;br/&gt;问题说明：这个是软件的免责申明。 &lt;br/&gt;解决办法：不用理会，继续安装即可！ &lt;br/&gt;错误提示六：无法在线检查证书有效性，请检查设置 &lt;br/&gt;问题说明：手机设置问题 &lt;br/&gt;解决办法：设置--手机设置--应用程序--程序管理：“软件安装”--选择 "全部"，“在线证书检查”-- &lt;br/&gt;选择 "关"即可！！ &lt;br/&gt;错误提示七：证书过期 &lt;br/&gt;问题说明：软件证书过期. &lt;br/&gt;解决办法： &lt;br/&gt;1：把手机时间调到证书的期限内（把手机时间往前调几个月）再安装，安装完毕后调回正确时间 &lt;br/&gt;（调整时间的方法：设置--手机设置--常规--日期和时间--日期） &lt;br/&gt;2：为软件重新签名 &lt;br/&gt;错误提示八：证书错误 &lt;br/&gt;问题说明：1.安装的软件没有签名　2.如果是JAR程序，一般是因为证书有冲突。（很多java游戏都会出 &lt;br/&gt;这个错误提示，解决办法看下面２） &lt;br/&gt;解决办法： &lt;br/&gt;1：为软件签名； &lt;br/&gt;2：将程序（软件／游戏）直接安装到手机上或更换存储卡 &lt;br/&gt;错误提示九：更新错误　 &lt;br/&gt;问题说明：一般出现这提示是因为安装软件时手机内有旧版本的相同软件没有删除，进行了重复安装。或 &lt;br/&gt;者因为新、旧版软件安装程序标题不同引起冲突。 &lt;br/&gt;解决办法： &lt;br/&gt;1： 卸载旧版软件之后，再安装新版本软件； &lt;br/&gt;2：把新版本软件解包，在PKG文档中把安装程序标题改为与旧版一致 &lt;br/&gt;错误提示十：证书尚未生效 &lt;br/&gt;问题说明：手机的时间超出软件证书的期限． &lt;br/&gt;解决办法： &lt;br/&gt;1：检查手机的日期是否设置正确； &lt;br/&gt;2：把手机时间调到证书的期限内，然后再装。在安装过后再调回正确时间即可 &lt;br/&gt;错误提示十一：未授予所需的程序接入权限 &lt;br/&gt;问题说明： &lt;br/&gt;1.出于塞班第三版系统的安全问题，一些程序的权限被禁止使用。没有该权限的程序都无法安装，或该程 &lt;br/&gt;序已经被签名。 &lt;br/&gt;2.证书出错． &lt;br/&gt;解决办法： &lt;br/&gt;1：使用未签过名的软件重新签名后再安装； &lt;br/&gt;2：去掉手机证书权限限制----XX手机 &lt;br/&gt;错误提示十二：证书受限制 &lt;br/&gt;问题说明： &lt;br/&gt;1：由软件签名出错或者软件已被多次签名引起 &lt;br/&gt;2：低权限证书签名了高权限程序 &lt;br/&gt;解决办法： &lt;br/&gt;1：使用未签过名的软件重新签名后再安装． &lt;br/&gt;2：核实该程序所要求的证书权限，证书权限要和程序权限相匹配。（目前本论坛制作的证书权限为17项 &lt;br/&gt;，签名19项权限的程序时有可能出现此问题）&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:3f7a2ebb-4d1d-4cf8-bca2-f3dcb6461204] --&gt;</description>
      <pubDate>Tue, 10 Nov 2009 07:46:38 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3321</guid>
      <dc:date>2009-11-10T07:46:38Z</dc:date>
      <clearspace:dateToText>1 week, 5 days ago</clearspace:dateToText>
    </item>
    <item>
      <title>扫盲贴2-塞班证书扫盲：掌握更多 S60第三版证书及签名详细介绍</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3320</link>
      <description>&lt;!-- [DocumentBodyStart:ffaebe28-3e55-40fd-b4b4-369d1f3a44ba] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;对于初次使用Symbian S60第三版的用户，经常会看到他们询问什么是证书？什么是签名？都有什么作用？等这样的问题。下面我们为大家分享了“S60第三版证书及签名的详细介绍”。&lt;br/&gt;&lt;a class="jive-link-external-small" href="http://group.zol.com.cn/tips/show_pic.php?picid=1981047"&gt;&lt;img border="0" src="http://img.zol.com.cn/group/199/a1981047.jpg"/&gt;&lt;/a&gt;&lt;br/&gt;&lt;span style="color: #ff0000;"&gt;1、什么是证书？&lt;/span&gt;　　&lt;br/&gt;证书就是“安装软件的许可”。当你安装某一软件的时候，nokia手机S60第三版系统会分析你要安装的软件身上带不带这个安装许可（证书），如果没有，则系统不让你安装。 　　&lt;br/&gt;证书有级别、权限的限制，最低等的证书只能用来安装普通游戏、主题、一般应用软件，这类证书可以通过关闭证书检查的设置选项（操作步骤：菜单键--应用程序--程序管理--选项--设置里，软件安装选择“全部”，在线证书检查选择“关”）来规避证书检查而获得安装，由于默认设置是关闭检查的，所以这也就是很多普通软件不需要证书就能安装的原因所在了。稍微高一点的证书可以让软件的信息进入手机 C 盘系统文件夹、让软件具有开机自动运行、修改system参数等高权限，目前需要我们自签名的证书都是此类证书。最高权限的证书可以修改系统，不过需要向nokia付费购买。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;2、证书的作用是什么？&lt;/span&gt; 　　&lt;br/&gt;就是为了提高系统安全性。众所周知，病毒发作是因为他可以未经授权偷偷装入你的系统，并且自动运行、调用程序，修改系统文件，并且每次开机自动运行，然后成倍复制自己并且在不同电脑之间传输，无法摆脱。而这些在S60第三版下都变成不可能，因为就是这个让你又爱又恨的证书验证机制。 　　&lt;br/&gt;即使是病毒制作者用了最低档的证书，你可以安装，但是他由于没有权限所以无法自启动、无法调用系统文件和程序，无法向别的手机扩散，所以等于废物。而要得到高权限，除非这个软件让你给他签名了，首先得过你自己这一关，假如你真的给一个病毒签名了，那么病毒的危害也是最小的，因为证书是和你手机唯一的IMEI码（串号）对应的，它不能扩散就失去了传播的可能性。病毒制作者做这样一个病毒有多少意义？现在唯一的可能是，病毒制作者获得最高权限证书才能实现罪恶目的，但是诺基亚怎么可能把证书授予一个病毒制作者？除非最高权限的证书被黑客破解。这样的事情还没有发生，因此S60第三版的杀毒软件目前来看都没有用武之地。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;3、如何获得证书？&lt;/span&gt; 　　&lt;br/&gt;普通用户要获得的第二种证书需要去symbian网站（ &lt;a class="jive-link-external-small" href="http://nokia.zol.com.cn/subcate_list_14.html"&gt;&lt;span style="color: #006699;"&gt;http://nokia.zol.com.cn/subcate_list_14.html&lt;/span&gt;&lt;/a&gt;）注册帐号，然后提供自己的串号申请，获得一个只适用于你手机的证书文件。现在symbian网站对注册邮箱的域名（即@后面的部分）限制的很厉害，相同的邮箱域名只能注册几个帐号，因此现在只能用很少见的或不对外公开注册的邮箱域名才有可能注册成功。所以大多数人都需要提供自己手机的串号，求助有帐号的网友代为制作证书。如果希望自己做证书，可以看相关的教程。 　　&lt;br/&gt;证书和你手机的唯一串号对应，所以证书不能通用。你自己的证书只能你自己的手机用，也就是说你可以用你的证书给你想装进自己手机的无数个软件签名使用。但是你不能用你的证书给别人签名，然后将签名完的软件装到别人的手机。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;4、证书有有效期吗？&lt;/span&gt; 　　&lt;br/&gt;有，从2007年12月份申请的新证书有效期都是3年，之前的证书有效期都是半年的。到期以后，已经安装的软件照样运行正常，唯一影响的只是你再用这个证书签名软件，那么该软件在安装的时候，S60第三版系统就会提示证书时间错误而不允许安装了。解决方法：要么你再去symbian网申请一个证书，要么你把你的手机时间调整到自己当初申请证书的时间之后的有效期内任意一个时间，然后用原证书签名，装完软件再把手机时间调整回正常。现在的证书有效期足够我们使用了，只是有些以前的已经破解签名的软件过了有效期，这种软件也可以用软件清除旧的签名重新签名使用。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;5、什么是签名？如何签名？&lt;/span&gt; 　　&lt;br/&gt;签名就是将你申请到的证书绑定到需要签名软件的安装程序里去，好让这个安装程序通过S60第三版的检查。其实这就是一个打包的过程。 　　电脑操作绑定的方法有好几种，最常用的就是通过专门的签名软件进行绑定。这里需要提一下，在制作证书的过程中是需要提供一个key文件来和证书对应（另一个安全验证机制）。签名时也需要使用制作证书时的key文件、证书、待签名软件三方绑定验证，不过现在制作的证书几乎都是使用的相同key文件，因此一些签名软件在签名时就不提示指定key文件了。S60证书签名专家（开心智能版）就是这样一款不需要指定 key 文件的很好用的签名软件。该软件界面简单易懂，不需要特别的介绍了，只要在软件签名窗口下指定证书和待签名软件执行签名就可以了。 　　&lt;br/&gt;有些朋友可能不方便使用电脑，signsis就是一款在手机上使用的签名软件，该软件需要key文件，签名时需要注意的是要选择“签名”，不要选择“自签名”，因为“自签名”权限低。生成的文件会在后缀名后多一个“x”，可以删除，不删除也不影响使用。 　　&lt;br/&gt;有些网友可能会遇到证书不管用的情况，大多是因为提供的串号有问题或证书与自己的手机串号不对应，证书的文件名一般是自己的手机串号，因此如果和自己的串号不对应，多数是有问题的，当然也不能排除制作者修改了证书名。还有一种可能就是制作者使用的key不是通用的。&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;6、哪些软件需要签名？&lt;/span&gt; 　　&lt;br/&gt;目前有实力的公司或确实有需要的公司会购买诺基亚的高级权限证书，通常是安全厂商。这类公司的软件不需要我们自签名。还有许多软件都是一般的应用软件，和系统没什么关联，它们权限很低，不可能存在危险，比如网络电视软件、阅读软件、QQ、主题等都不需要签名。需要签名的软件软件大致可分为以下几种情况： 　　&lt;br/&gt;（1）随开机启动的，比如来电通，A4自签名版； 　　&lt;br/&gt;（2）不要你操作可以自动运行的，比如屏保程序；　　&lt;br/&gt;（3）进入系统文件夹修改的，比如大部分后期汉化的软件，比如mimo等。&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:ffaebe28-3e55-40fd-b4b4-369d1f3a44ba] --&gt;</description>
      <pubDate>Tue, 10 Nov 2009 07:38:02 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3320</guid>
      <dc:date>2009-11-10T07:38:02Z</dc:date>
      <clearspace:dateToText>1 week, 5 days ago</clearspace:dateToText>
    </item>
    <item>
      <title>How to pause a Java application on the S60 platform</title>
      <link>http://developer.sonyericsson.com/community/docs/DOC-3318</link>
      <description>&lt;!-- [DocumentBodyStart:a16409ee-a319-4051-8cd3-34dede1dc745] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;h3&gt;Introduction&lt;/h3&gt;&lt;p&gt;There is a slight change between how one does to pause an apllication in S60 phones and in JP phones.&lt;/p&gt;&lt;p&gt;This article describes how to pause a java application on a S60 phone.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;Enable application pause.&lt;/h3&gt;&lt;p&gt;Set Jad property &lt;!----&gt;&lt;span lang="EN-US" style="color: #1f497d;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;amp;quot;MS Shell Dlg&amp;amp;quot;,&amp;amp;quot;sans-serif&amp;amp;quot;; color: black;"&gt;Nokia-MIDlet-Background-Event: pause&lt;/span&gt;&lt;span lang="EN-US" style="color: #1f497d;"&gt; &lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Listen to event hideNotify().&lt;/p&gt;&lt;p&gt;Upon reception call your pauseApp. Most developers tend call pauseApp() manually.&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:a16409ee-a319-4051-8cd3-34dede1dc745] --&gt;</description>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=?14&amp;container=2087">s60</category>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=?14&amp;container=2087">javame</category>
      <category domain="http://developer.sonyericsson.com/community/tags?containerType=?14&amp;container=2087">jad</category>
      <pubDate>Fri, 06 Nov 2009 13:01:46 GMT</pubDate>
      <author>developerworldwatch@kpi-consulting.net</author>
      <guid>http://developer.sonyericsson.com/community/docs/DOC-3318</guid>
      <dc:date>2009-11-06T13:01:46Z</dc:date>
      <clearspace:dateToText>2 weeks, 1 day ago</clearspace:dateToText>
    </item>
  </channel>
</rss>

