当前位置:  编程技术>移动开发
本页文章导读:
    ▪Surface,送小弟我都不要        Surface,送我都不要SurfaceRT在入手一周后出掉了,换了台华硕的普通笔记本给京京用。因为这个Surface得来没花钱,等于是送的。所以也不算是标题党吧。虽然我作为一名资深微软黑,长期以黑.........
    ▪ Thinking In Java 学习札记(一)        Thinking In Java 学习笔记(一)最近都在学习java,以下是学习笔记。 1 线程 1.1基本线程处理 1)throw与throws的区别 前者用于抛出单个异常,并且该异常知道如何处理,通常是放在catch子句块中.........
    ▪ 安全卫士第三天-21归属地控件拖动书后录位置       安全卫士第三天--21归属地控件拖动后记录位置 拖动后     public class DragViewActivity extends Activity implements OnTouchListener {  private static final String TAG = "DragViewActivity";  private ImageView iv_drag_view;  priv.........

[1]Surface,送小弟我都不要
    来源: 互联网  发布时间: 2014-02-18
Surface,送我都不要

SurfaceRT在入手一周后出掉了,换了台华硕的普通笔记本给京京用。因为这个Surface得来没花钱,等于是送的。所以也不算是标题党吧。

虽然我作为一名资深微软黑,长期以黑微软为乐,但其实在一年前,我对微软在移动领域的新动作还是略赞赏的——《MDCC印象之二:芒果的味道》。

可惜啊,到头来微软终归还是不行,都不能给我一个不黑的机会。

上次喷PC厂商的时候,已经顺带黑了一次——《人类已经无法阻止苹果了——吐槽PC厂商》。

不过因为当时Win8还没出来,大部分还是基于传闻。现在大半年过去,win8已经上市,Surface也用过了,连Surface Pro都快要出来了,可以一喷了。

要正式开喷了,又有点无从下手的感觉——不是因为喷点太少,而是太多,不知道从哪个开始喷起……

那就还是先从它乏善可陈的优点说起吧。

首先就是去年赞过的UI,这套始于WP7的UI(原来叫MetroUI现在被迫改名不知道叫什么的)的确还是有新意的。除了WinRT系统本身的应用以外,我还装了一些别的应用,UI都不错,有些甚至比它们的iOS版都要好看很多——果粉不要怒,真的好看。

其次就是福布斯曾经发文赞过的Surface四大优势之 一:桌面环境。这个iOS是没有的,Android上虽然也可以自己整个Linux桌面上去,但是难度还是相当大的。更不用说Surface还带了一个键 盘cover,方便很多。至于说另外三个所谓的优势……除了多帐户以外,Android都早就有了,有些iOS也有,多帐户在新的Jelly Bean里也已经有了。

第三,虚拟键盘和输入法都比iOS强太多——果粉也不要急,去试试就知道。

最后,屏幕的显示效果还不错,亮度色彩什么的,加上宽屏,看电影还是很不错,特别是附带的支架加cover摆放特别方便,不用手拿着那么累。

没了……

然后开始吐槽吧。就从PC厂商那篇的主要槽点开始……

价格!价格!还是价格!

作为一个来晚的平板电脑商,跟下面要喷的那么多缺点相比,就上面那么几个可以算是优点的东西,凭什么卖得比别人贵,还贵那么多。国外有人作了拆机对比,发现Surface的硬件成本比同档次的iPad还要低一些。这就更说不过去了,包耳膜的脑子被枪打过了吗?

你们来晚这么多年,最重要的工作难道不是从市场领先者那里抢占市场份额吗?就凭这样没诚意的价格吗?我看除了铁杆微软粉,没多少人能接受这样的价格吧。上市以来的销量也足以说明问题。

WinRT不是Windows!

我知道你们要说Pro,这个后面再说,微软粉也别急。

虽 然Surface提供了一个桌面环境,但这毕竟不是真正的Windows,因为ARM的CPU决定了你无法在这上面跑Windows程序——除了少量移植 过来的应用。所以这个环境基本上就只是为了跑Office——当然,这对一些人来说很重要。但是阅读和少量的编辑工作在iPad/AndroidPad上 也完全可以实现。至于大量的编辑工作……还是用电脑吧。

Apps是王道!

虽然微软号称它们的市场里软件已经很多了,大概是指 英文市场吧,反正我等了半天连上微软的菜市场,里面的App感觉翻了没几页就没了,虽然叫得上名字的互联网巨头基本都有做WP版,但还是有很多没有的,比 如某宝。其它小众应用就更不用说了,默认都是没有的,碰到有的,那纯属中奖。

说到菜市场,不得不说一下微软的网络。

众所周知 GooglePlay菜市场在兲朝是河蟹物,访问起来已经算是相当困难的了,比AppStore速度明显慢。但是用过微软的菜市场才知道,原来还有更慢 的,真不知道微软是怎么弄自己的菜市场网站的。当然可能还有一部分原因是这个应用启动本来就慢。事实上不止菜市场,WinRT里所有需要连网的应用启动都 明显慢。

虽然UI操作上是挺流畅,但是应用运行或启动速度慢,同样还是影响用户体验的。

相比之下,别说iOS,就是Android也好很多。

还有就是WinRT也太大了,64G版的Surface也就只能当32G的iPad来用,而不论是在可用性还是价格方面,iPad都完胜……都不用出动iPad3,iPad2足矣。

其它如cover键盘不好用、磁力电源接头不好使这种小问题就不提了。

最后再来说说Pro吧。

Pro用的是X86的CPU,跑的是正宗的Win8,貌似微软桌面的优势将全面延续。

但是我仍然不看好……

基本的理由就是:平板的用户需求与桌面相当不同,按令狐虫的话来说就是:平板用户主要是内容的消费者,桌面用户主要是内容的生产者,两头都想兼顾的结果就是两头不讨好。

比如说,cover改善了平板不方便大量输入的问题,但因为这个cover并不是很好用,这个优势不明显。使用X86CPU改善了性能并兼容传统应用,但是增加了发热了耗电减少使用时长——或者增加体积重量价格,相比专门的平板,这些都是劣势。事实上,目前已经透露的消息已经足够说明问题了—— Surface Pro电池使用时间将比Surface RT短一半,价格却要贵将近一倍。

而如果拿这货跑桌面应用,那其实不就是个超级本嘛。

与其如此,不如买个Mac Book Air,价钱差不多还用得久,体积重量未必差多少——一定要找一个优点的话,1080P全高清屏算一个,只是Retina MBA要是出来呢?更何况Surface那个破键盘…

而且Pro这货还不是最贵的,看了一下已经上市的其它X86 Win8平板/电脑,更贵。

我说PC领域里的这一帮子软硬件商们,醒醒吧,看看周围的世界现在是什么样了。

总之还是跟我去年说的差不多:就现在这个市场来说,价格是王道。

当然,即使Surface Pro价格很便宜我也不会买,送我也会被我卖掉,换个手机什么的。原因就是Surface Pro有微软签名的SB(Secure Boot——建议了解一下这货,加上微软签名以后绝对是个反人类的东西,要没这货,我可能还会对Surface Pro印象好点),不能拿来安装别的OS,而我不用Windows已经很多年…

1楼jeepxiaozi昨天 10:52mark一下,提醒博主小心微软死忠,哈哈哈,PS:我不是

    
[2] Thinking In Java 学习札记(一)
    来源: 互联网  发布时间: 2014-02-18
Thinking In Java 学习笔记(一)

最近都在学习java,以下是学习笔记。


1 线程
1.1基本线程处理
1)throw与throws的区别
前者用于抛出单个异常,并且该异常知道如何处理,通常是放在catch子句块中,当然也可以在任何想抛出异常的地方。后者可以抛出单个或多个异常,不知道如何处理,通常是放在函数定义后。如下代码片段。

2)join作用
参加,也要别人同意啊。所以,这个函数就是在保证其他线程执行完后,才创建线程。如下,循环创建多个线程,每个线程都是在前面一个线程完成执行后才创建的。
for(int i = 0;i < 5;i ++){
new TestThread().join();
}
3)setPriority设置优先级
可以用来设置线程优先级,优先级高的会使得其执行频率增加。
对于每个操作系统,所规定的线程优先级级数不一致。JDK规定了十个级数。一般使用Thread.MAX_PRORITY、Thread.NORMAL_PRORITY、Thread.MIN_PRORITY三个级数,就可以避免在不同操作系统出现的此类问题。
4)deamon设置为后台
public final void setDaemon (boolean isDaemon)
可以用来设置为后台进程。
某线程A为非后台进程,若使用该函数创建了后台进程B,那么当A终止执行时,后台进程B也会终止执行,即使B仍未执行完代码。
5)join进阶作用
线程A在等待另一个线程B执行完之前,若B自己调用interrupt终止执行,则A马上继续执行join后面的代码。
Join也能传入一个时间参数,该参数表示在规定时间到达时,不管B是否执行完,A均继续执行join后面的代码。
6)runable的作用
Runable使得对象在继承了其他类的情况下,实现线程方法,间接实现多重继承。
Runable只有run方法,当要实现除run方法以外的方法时,可以通过Thread.currentThread()来获得线程对象。如下

使用内部类将线程方法封装起来更加清晰,这里不使用runable。
如下。


1.2进阶线程处理
1)timer.schedule
小贴士
Timer.schedule
void schedule(TimerTask task, long delay)
Schedule a task for single execution after a specified delay.
一般用在运行一个delay的任务,跟thread.sleep差不多。
2)synchronize使用
Static synchronize修饰的方法用于对整个类下所有实例化的对象调用到该方法时均需要同步处理。
Synchronize修饰的方法用于对类下每个实例化的对象在调用到该方法时需要同步处理,也即若A、B两个对象都属于同一个类,A、B两对象在访问到同一个synchronize修饰的类方法时,互不干扰。只有在A这个类第二次访问到A这个方法或是B这个类第二次访问到B这个方法,才有同步处理。
小贴士
以下摘自http://blog.csdn.net/virgoboy2004/article/details/7585182,谢谢作者。
【问题描述】关于Java中synchronized 用在实例方法和对象方法上面的区别
【问题分析】大家都知道,在Java中,synchronized 是用来表示同步的,我们可以synchronized 来修饰一个方法(实例方法和类方法---注:不知道这样叫准确不准确,大家理解我的意识就行了)。也可以synchronized 来修饰方法里面的一个语句块。
修饰实例方法:
[java] view plaincopy
1. public synchronized void x() throws InterruptedException
2. {
3. for (int i = 0; i < 10; i++)
4. {
5. Thread.sleep(1000);
6. System.out.println("x.......................");
7. }
8. }

修饰类方法(static 方法):
[java] view plaincopy
1. public static synchronized void staticX() throws InterruptedException
2. {
3. for (int i = 0; i < 10; i++)
4. {
5. Thread.sleep(1000);
6. System.out.println("staticX.......................");
7. }
8. }

修饰方法里面语句块:
[java] view plaincopy
1. public static void staticX() throws InterruptedException
2. {
3. synchronized (locks)
4. {
5. for (int i = 0; i < 10; i++)
6. {
7. Thread.sleep(1000);
8. System.out.println("staticX.......................");
9. }
10. }
11. }
注意:这里不能用synchronized修饰方法外面的语句块(我把他叫做类语句块),虽然我们可以在方法外面定义语句块,这样做会遇到编译错误,这里涉及到了Java里面的对象初始化的部分知识。大概的原因就是synchronized锁住的是对象,当初始化对象的时候,JVM在对象初始化完成之前会调用方法外面的语句块,这个时候对象还不存在,所以就不存在锁了。
那么,在static方法和非static方法前面加synchronized到底有什么不同呢?
大家都知道,static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,就是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。而非static方法获取到的锁,就是当前调用这个方法的对象的锁了。所以,他们之间不会产生互斥。
看代码:
[java] view plaincopy
1. package com.jack.zhang.chapter9.classlock;
2.
3. /**
4. * @author Jack Zhang
5. * @version vb1.0
6. * @Email virgoboy2004@163.com
7. * @Date 2012-5-20
8. */
9. public class Test
10. {
11. public static synchronized void staticX() throws InterruptedException
12. {
13. for (int i = 0; i < 10; i++)
14. {
15. Thread.sleep(1000);
16. System.out.println("staticX.......................");
17. }
18. }
19.
20. public synchronized void x() throws InterruptedException
21. {
22. for (int i = 0; i < 10; i++)
23. {
24. Thread.sleep(1000);
25. System.out.println("x.......................");
26. }
27. }
28.
29. public static void main(String[] args)
30. {
31. final Test test1 = new Test();
32. Thread thread = new Thread(new Runnable()
33. {
34. public void run()
35. {
36. try
37. {
38. test1.x();
39. }
40. catch (InterruptedException e)
41. {
42. // TODO Auto-generated catch block
43. e.printStackTrace();
44. }
45. }
46. }, "a");
47.
48. Thread thread1 = new Thread(new Runnable()
49. {
50. public void run()
51. {
52. try
53. {
54. Test.staticX();
55. }
56. catch (InterruptedException e)
57. {
58. // TODO Auto-generated catch block
59. e.printStackTrace();
60. }
61. }
62. }, "b");
63.
64. thread1.start();
65. thread.start();
66. }
67. }

运行结果是:
[java] view plaincopy
1. staticX.......................
2. x.......................
3. x.......................
4. staticX.......................
5. staticX.......................
6. x.......................
7. x.......................
8. staticX.......................
9. x.......................
10. staticX.......................
11. staticX.......................
12. x.......................
13. x.......................
14. staticX.......................
15. x.......................
16. staticX.......................
17. x.......................
18. staticX.......................
19. x.......................
20. staticX.......................


那当我们想让所有这个类下面的对象都同步的时候,也就是让所有这个类下面的对象共用同一把锁的时候,我们如何办呢?
看代码:
[java] view plaincopy
1. package com.jack.zhang.chapter9.classlock;
2.
3.
4. /**
5. * @author Jack Zhang
6. * @version vb1.0
7. * @Email virgoboy2004@163.com
8. * @Date 2012-5-20
9. */
10. public class Test
11. {
12. public final static Byte[] locks = new Byte[0];
13.
14. public static void staticX() throws InterruptedException
15. {
16. synchronized (locks)
17. {
18. for (int i = 0; i < 10; i++)
19. {
20. Thread.sleep(1000);
21. System.out.println("staticX.......................");
22. }
23. }
24. }
25.
26. public void x() throws InterruptedException
27. {
28. synchronized (locks)
29. {
30. for (int i = 0; i < 10; i++)
31. {
32. Thread.sleep(1000);
33. System.out.println("x.......................");
34. }
35. }
36. }
37.
38. public static void main(String[] args)
39. {
40. final Test test1 = new Test();
41. final Test test2 = new Test();
42. Thread thread = new Thread(new Runnable()
43. {
44. public void run()
45. {
46. try
47. {
48. test1.x();
49. }
50. catch (InterruptedException e)
51. {
52. // TODO Auto-generated catch block
53. e.printStackTrace();
54. }
55. }
56. }, "a");
57.
58. Thread thread1 = new Thread(new Runnable()
59. {
60. public void run()
61. {
62. try
63. {
64. Test.staticX();
65. }
66. catch (InterruptedException e)
67. {
68. // TODO Auto-generated catch block
69. e.printStackTrace();
70. }
71. }
72. }, "b");
73.
74. thread1.start();
75. thread.start();
76. }
77. }

运行结果:
[java] view plaincopy
1. staticX.......................
2. staticX.......................
3. staticX.......................
4. staticX.......................
5. staticX.......................
6. staticX.......................
7. staticX.......................
8. staticX.......................
9. staticX.......................
10. staticX.......................
11. x.......................
12. x.......................
13. x.......................
14. x.......................
15. x.......................
16. x.......................
17. x.......................
18. x.......................
19. x.......................
20. x.......................


    
[3] 安全卫士第三天-21归属地控件拖动书后录位置
    来源: 互联网  发布时间: 2014-02-18
安全卫士第三天--21归属地控件拖动后记录位置

 拖动后

 

 

public class DragViewActivity extends Activity implements OnTouchListener {
 private static final String TAG = "DragViewActivity";
 private ImageView iv_drag_view;
 private TextView tv_drag_view;
 int startx; // 记录下来第一次手指触摸屏幕的位置
 int starty;
 private SharedPreferences sp;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.drag_view);
//  Drawable drawable = new ColorDrawable(Color.RED);
//  getWindow().setBackgroundDrawable(drawable);
  iv_drag_view = (ImageView) this.findViewById(R.id.iv_drag_view);
  tv_drag_view = (TextView) this.findViewById(R.id.tv_drag_view);
  sp = getSharedPreferences("config", MODE_PRIVATE);
  iv_drag_view.setOnTouchListener(this);
 }

 
 
 
 @Override
 protected void onResume() {//控件显示出来,并且获取焦点后调用该方法
  super.onResume();
  // 重新加载上次imageview在窗体中的位置
  int x = sp.getInt("lastx", 0);
  int y = sp.getInt("lasty", 0);
  Log.i(TAG, "x="+x);
  Log.i(TAG, "y="+y);
//  iv_drag_view.layout(iv_drag_view.getLeft()+x, iv_drag_view.getTop()+y, iv_drag_view.getRight()+x, iv_drag_view.getBottom()+y);
//  // 重新渲染 这个view对象
//  iv_drag_view.invalidate();
  
  //通过布局 更改 iv_drag_view 在窗体中的位置
  LayoutParams params = (LayoutParams) iv_drag_view.getLayoutParams();
  params.leftMargin = x;
  params.topMargin = y;
  iv_drag_view.setLayoutParams(params);
 }

 


 public boolean onTouch(View v, MotionEvent event) {
  switch (v.getId()) {
  // 如果手指放在imageview上拖动
  
  
  case R.id.iv_drag_view:
   //
   switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:
    startx = (int) event.getRawX(); // 获取手指第一次接触屏幕在x方向的坐标
    starty = (int) event.getRawY();
    break;
   case MotionEvent.ACTION_MOVE: // 手指没有离开屏幕 在屏幕移动
    int x = (int) event.getRawX();
    int y = (int) event.getRawY();
    
    if(y<240){
     // tv_drag_view 设置textview在窗体的下面
     tv_drag_view.layout(tv_drag_view.getLeft(), 260, tv_drag_view.getRight(), 280);
    }else{
     tv_drag_view.layout(tv_drag_view.getLeft(), 60, tv_drag_view.getRight(), 80);
    }
    
    
    //获取手指移动的距离
    int dx = x-startx;
    int dy = y-starty;
    int l= iv_drag_view.getLeft();
    int t= iv_drag_view.getTop();
    int r = iv_drag_view.getRight();
    int b = iv_drag_view.getBottom();
    
    iv_drag_view.layout(l+dx, t+dy, r+dx, b+dy);
    
    startx = (int) event.getRawX(); // 获取到移动后的位置
    starty = (int) event.getRawY();
    
    break;
   case MotionEvent.ACTION_UP: // 手指离开屏幕对应的事件
    Log.i(TAG,"手指离开屏幕");
    // 记录下来最后 图片在窗体中的位置
    
    int lasty = iv_drag_view.getTop();
    int lastx = iv_drag_view.getLeft();
    Editor editor = sp.edit();
    editor.putInt("lastx", lastx);
    editor.putInt("lasty", lasty);
    editor.commit();
    break;
   }
   
   
   break;

  }

  return true; // 不会中断触摸事件的返回,默认只执行一次。
 }

}

 

 

xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#cc000000"
 >
<ImageView
     android:layout_width="160dip"
     android:layout_height="60dip"
     android:background="@drawable/button_background_selected"
  android:id="@+id/iv_drag_view"
   
    />
 <TextView
     android:id="@+id/tv_drag_view"
     android:layout_marginTop="80dip"
      android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="按住绿色条拖动归属地显示的位置"
    
     />  

</RelativeLayout>

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
windows iis7站长之家
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3