2012年9月4日星期二

Android开发笔记(三)


Android开发笔记(三)
     -- 问题积累篇

只简述三个简单的问题,”问题清楚了同时解决了,自然简单了。“

1. Android Wifi-Direct
    中文说法为wifi直连,即目前在比较高端的移动终端设备Android系统4.0+以上支持这款技术功能。Wifi-Direct,设计初衷是允许移动通讯设备(目前主要是手机或Pad)在无公网的条件下实现P2p传输的前沿技术,该技术的实现是基于Wifi技术至上。详情可以参见百度百科维基
     这里提一个之前遇到的疑问点,很简单。刚开始从事wifi-direct开发时了解到,一般情况下两台设备D1、D2(均支持Wifi-Direct),若D1连接D2成功,则D2作为热点(Owner端)接收了D1的连接请求,即被连接者作为热点。但是开发与调试过程,偶尔发现一种情况,两者连接成功了,确是D1(连接者)作为热点了!一时困惑也没去理会,直到后来有时间了去查询情况方知真相,(引文)如下:    

The Wi-Fi Direct devices negotiate when they first connect to determine which device acts as an access point.

PS. 可以参考该链接页面的描述。

2. Java类成员构造顺序
由于Java语言允许类成员的声明与定义(包括初始化)放在一起,所以我们(新手)经常喜欢并习惯这么做。但是,这样做容易导致程序异常错误,最典型的就是使用null空指针的异常错误。出错的原因在于,作为新手你估摸不准那些涉及到的对象,彼此有相互引用,他们的构造顺序(构造顺序是Java虚拟机帮你默默完成的)。当然高手就不然了,正所谓高手写的程序先于在机器允许已在心中运行了。不如,以下举一个简单的示例吧,伪码描述如下:
public class MainActivity extends Activity {
     private Fragment frag = new XXXFragment(...);
     public Fragment getFragment {
          renturn frag;
     }
 
     private Service service = new XXXService(this);
}

class XXXService extends Service {
     private Fragment frag
     XXXService(MainActivity activity) {
          frag = activity.getFragment();//Maybe frag is null here.
          ...
     }
 
     void run() {
          ... use frag... // Maybe throw nullPointerException here.
     }
}

3. Android Service子类
Android系统服务Service类型需定义为public(同时与对应所在的java源文件同名,该点属于Java开发语言规定的),用时需要在AndroidManifest.xml文件声明,如下:
// NetworkService.java
public class NetworkService extends Service {
     ...
}
    <uses-permission android:name= "android.permission.SERVCE" />
AndroidManifest.xml

...
    <application
               ...
        <!-- 声明下面的服务 -->
        <service android:enabled="true" android:name= ".NetworkService" />
               ...
    </application >
...


 --- 更新于20120915 --
5. 官方针对Handler子类定义的说明(注意点),如下:
Android, Handler classes should be static or leaks might occur. Messages enqueued on the application thread's MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class.
---

4. 不应该在UI主线程加锁,且加锁无效果。
          //lockSendFile.lock(); // 貌似在UI主线程加锁无效。

(希望后续更新,待续……)

没有评论:

发表评论