分散化:Android的优势同时也是劣势 - 移动开发 - ITeye资讯
相关知识库:
Android手机市场份额突飞猛进,尽管其生命周期很短。在运营了两年之后,Android在2005年被Google收购了。Google在2007年底的时候公开了这件事。现在,Android已经占据了全球智能机市场超过50%的份额。苹果的iOS,则占到了19%。Android是如何打败iOS?***是分散化。
分散化分布:优势
Android在分布上有优势。Google通过一个免费的很有竞争力的平台抓住了HTC、三星以及摩托罗拉等公司的心,而不像微软那样收取巨额的授权费。这件礼物拯救了他们,并且将智能机带到了更多人的口袋中。无需合约,你就可以拿到一款100美元以下的Android手机。当然也有Verizon的两年合约价300美元的Droid Bionic。
跟iOS不一样,Android的所有产品不是一个尺寸的。除了价格范围,Android的灵活性可以让不同的制造商用自己的方法来进行各种创新。Android上面有各种主题可以选择。
iPhone最初的时候只有AT&T一家运营商,而Android则不限制运营商,尽管现在iPhone在全美有三家运营商了,但是已经有些晚了。
混合的结果:碎裂的负面
Android最坏的一点就是太过于自由分散的运营商和制造商。大量外形类似的Android设备让消费者感觉凌乱,最差的也经常是最便宜的。糟糕的硬件导致了很不舒服的体验。
硬件还不是唯一的问题。制造商对UI的各种重置,比如摩托的Motoblur或者HTC的HTC Sense。这些限制也让体验变得暗淡无味了。很难想象电脑制造商打造他们自己的Windows界面。不幸的是,许多的UI重置都是没有必要的。
操作系统的分裂是另一个问题。如果某个手机需要更新,Google需要依赖制造商和运营商,这就让Android的体验更差了。这也让开发者很崩溃,必须对各种版本各种设备做适配。
最大的问题在于Android自身分裂得一塌糊涂。因为有太多的选项,就没有一个单一值得期待的产品。iPhone只有一个操作系统,每年一部硬件。如果谁说有一个Android手机,这可能意味着质量等各方面的混乱。在大的Android设备制造商和山寨厂商之间也有很多断层。
Windows Phone是Android的最大竞争对手
对于一部Windows Phone手机,看上去就像是将桌面的操作系统放到了黑莓手机里面。光阴似箭,微软已经在这场比赛中有点落后了。不过还好,WP7出来之后,用户对鲍尔默又有点信心了。很多诺基亚的粉丝,很喜欢其良好的硬件设计。也有用户表示如果有机会,会将iOS5填进诺基亚的N9中。
Android面临的最大威胁应该是微软,因为尽管iPhone的销量在递增,但其不可能独霸市场。WP现在开始占据各种设备和运营商了,Android也不再是苹果之外的唯一选择了。
如果Android还能保持移动市场的份额,平板份额也继续增长,其还是会活很长时间的。不过如果微软好好利用Windows Phone,那么Android可能就危险了。
分散化既是一个祝福,也是一个诅咒。Google因此快速扩张,但是可能很难收摊。iPhone和Android都比之前更强悍了,甚至把一度很强势的RIM搞得不行了,不过时间会告诉我们什么才会活下来。希望Google在用户体验上多花点功夫,而不是打造一些能够让别人吹嘘的东西。
这一堆小机器人看起来蛮彪悍的,不知道会不会一拥而上把那个苹果啃的核都不剩。
这话反过来说也可以,是劣势,也是优势,虽然都是android,但可以各有特色,看起来各不相同。好与坏,最终还是看用户选择,看市场占有率,android再怎么不好,再怎么性能低下不如爱疯,现在用android的人越来越多,也是可以说明问题的。爱疯喜欢搞饥饿营销,价格高,不容易买到,预订都是“尊贵”,但不是每个人都需要爱疯,都喜欢这样。
运营商开始推win phone了,怕android垄断市场。
近来的新闻好像对苹果很不利啊!
引用许多的UI重置都是没有必要的 大可不必,4.0一统江湖算了导语:之前做习惯了Framework层的开发,今天在武汉斗鱼公司面试APP客户端的开发,其中一道题是讲述Asynctask的优缺点,我靠,我只是知道有这么一个东西,会用而已,看来之前的生活太过于安逸,这么基础的东西都不会,特意回家总结下。
转载请注明原文链接:
1、Asynctask简介
1.1 使用方法简介
Asynctask作为Android的基础之一,怎么使用就不多讲解了,网上到处都是教程,建议查看Android官方API文档:
这里只实现一个小Demo程序,供大家赏玩:
&这个程序其实特别简单,就是两个按钮,点击分别用来测试AysncTask和Handler两种模式的实现,点击后会有相应的Log提示。
功能简介:
Asynctask的实现:
private class IAsyncTask extends AsyncTask&String, Integer, String& {
protected String doInBackground(String... args1) {
Log.i(TAG, "doInBackground in:" + args1[0]);
int times = 10;
for (int i = 0; i & i++) {
publishProgress(i);//提交之后,会执行onProcessUpdate方法
Log.i(TAG, "doInBackground out");
return "over";
* 在调用cancel方法后会执行到这里
protected void onCancelled() {
Log.i(TAG, "onCancelled");
* 在doInbackground之后执行
protected void onPostExecute(String args3) {
Log.i(TAG, "onPostExecute:" + args3);
* 在doInBackground之前执行
protected void onPreExecute() {
Log.i(TAG, "onPreExecute");
* 特别赞一下这个多次参数的方法,特别方便
* @param args2
protected void onProgressUpdate(Integer... args2) {
Log.i(TAG, "onProgressUpdate:" + args2[0]);
点击第一个按钮后会执行这里,点击按钮的写法如下:
mBtnSyncTask.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new IAsyncTask().execute("yanlog test");
执行结果的Log如下:
1 02-19 21:55:12.179 /com.plbear.asynctasktest I/AsyncTaskTest: doInBackground in:yanlog test//doInbackground是在10824进程,11010线程中执行
2 02-19 21:55:12.179 /com.plbear.asynctasktest I/AsyncTaskTest: doInBackground out
3 02-19 21:55:12.184 /com.plbear.asynctasktest I/AsyncTaskTest: onProgressUpdate:0//剩下的都是在10824线程中执行,Android特别好的是,主线程的线程号跟进程号是一致的
4 02-19 21:55:12.184 /com.plbear.asynctasktest I/AsyncTaskTest: onProgressUpdate:1
5 02-19 21:55:12.184 /com.plbear.asynctasktest I/AsyncTaskTest: onProgressUpdate:2
6 02-19 21:55:12.184 /com.plbear.asynctasktest I/AsyncTaskTest: onProgressUpdate:3
7 02-19 21:55:12.184 /com.plbear.asynctasktest I/AsyncTaskTest: onProgressUpdate:4
8 02-19 21:55:12.184 /com.plbear.asynctasktest I/AsyncTaskTest: onProgressUpdate:5
9 02-19 21:55:12.184 /com.plbear.asynctasktest I/AsyncTaskTest: onProgressUpdate:6
Handler+Message实现:
&主要代码如下:
private class IHandler extends Handler{
public void handleMessage(Message msg){
switch(msg.what){
Log.e(TAG,"handler:"+msg.obj);
msg.what = 1;
Log.e(TAG, "post message:" + i);
}).start();
可以看到Log打印结果如下:
1 02-19 22:25:17.689 /com.plbear.asynctasktest E/AsyncTaskTest: post message:0 //可以看到提交是在9319号子进程中提交
2 02-19 22:25:17.689 /com.plbear.asynctasktest E/AsyncTaskTest: post message:1
3 02-19 22:25:17.689 /com.plbear.asynctasktest E/AsyncTaskTest: post message:2
4 02-19 22:25:17.689 /com.plbear.asynctasktest E/AsyncTaskTest: post message:3
5 02-19 22:25:17.689 /com.plbear.asynctasktest E/AsyncTaskTest: post message:4
6 02-19 22:25:17.689 /com.plbear.asynctasktest E/AsyncTaskTest: post message:5
7 02-19 22:25:17.689 /com.plbear.asynctasktest E/AsyncTaskTest: post message:6
8 02-19 22:25:17.689 /com.plbear.asynctasktest E/AsyncTaskTest: post message:7
9 02-19 22:25:17.689 /com.plbear.asynctasktest E/AsyncTaskTest: post message:8
int times = 10;
for (int i = 0; i & i++) {
publishProgress(i);//提交之后,会执行onProcessUpdate方法
Log.i(TAG, "doInBackground out");*/
Log.i(TAG, "doInBackground in thread:" + args1[0]);
int times = 4;
for (int i = 0; i & i++) {
Log.i(TAG, "thread alive:" + i + " for times"+args1[0]); //这个doInBackground就打印一个Log,然后sleep 20 毫秒
Thread.sleep(20);
} catch (Exception e) {
return "over";
调用的地方这么写:
for (int i = 0; i & N; i++) {
你本来希望系统应该这么执行
但是实际上系统是这么执行的:
那么从源码看下为啥会这样吧。
AsyncTask中默认的Exector是这个private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;看下SERIAL_EXECUTOR是这么定义的
1 public static final Executor SERIAL_EXECUTOR = new SerialExecutor(); //这是一个串行处理的Executor
2 .........................
private static class SerialExecutor implements Executor {
final ArrayDeque&Runnable& mTasks = new ArrayDeque&Runnable&();
Runnable mA
public synchronized void execute(final Runnable r) {
mTasks.offer(new Runnable() { //先把要执行的子线程统一丢到mTasks队列中,这其中封装一遍Runnable
public void run() {
scheduleNext(); //当前面一个子线程处理完,开始处理下一个
if (mActive == null) {
if ((mActive = mTasks.poll()) != null) {
呵呵,这下子明白了吧。
Google为什么要怎么实现我不得而知,估计有什么我没有明白的好处在里面吧。那么有没有办法规避呢?
可以看到上面有一个THREAD_POOL_EXECUTOR,这个也是一个executor是这么定义的
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
sPoolWorkQueue, sThreadFactory);
THREAD_POOL_EXECUTOR = threadPoolE
public static void setDefaultExecutor(Executor exec) {
&所以规避方法是:通过这个方法可以设置默认的Exector,但是这个方法是hide的,也就是Google的隐藏方法,估计需要用一下反射来处理。我偷个懒,不去实现了。
& 本来嘛,我只是想简单写一下AsyncTask的一些相关知识,Copy一下网上的内容,但是没有想到写到最后,发现网上的大部分东西是错的,或者没有抓到重点。看来以后还是要自己亲自看代码,纸上得来终觉浅,便知此事要躬行。
本文中用到的工程代码可以到我的github中查看,路径:
好了,写完了,大家看到之后觉得还可以的话,点个赞哈。
阅读(...) 评论()