本文共 5687 字,大约阅读时间需要 18 分钟。
载入时间
Static 属于类 唯一性
static代码块>构造方法 懒汉跟饿汉
三要素
1.私有的构造方法 防止多个实例private SingleTon() {}2.静态的实例变量 static 唯一性private static SingleTon singleTon = new SingleTon(); 3.静态的获取方法 静态变量只能由静态方法获取public static SingleTon getInstance() {return singleTon;}
==使用
怎么判断是同一个实例? 06-13 01:25:07.925: I/System.out(307): cn.itcast.a.singleton.SingleTon@43e3e6f0 06-13 01:25:07.925: I/System.out(307): cn.itcast.a.singleton.SingleTon@43e3e6f0 地址比方:学员在教室里面的座位 |
private static SingleTon singleTon = new SingleTon();/** * 获取实例方法 * * @return */public static SingleTon getInstance() {return singleTon;}1.3.2. 懒汉:用到时急着创建,太懒了
/** * 静态实例 */private static SingleTon1 singleTon = null;/** * 获取实例方法 * * @return */public static SingleTon1 getInstance() {if (singleTon == null) {// 用到才创建singleTon = new SingleTon1();}return singleTon;}
1.synchronized 同步方法 2.同步代码块
// 同步方法 不推荐// public static synchronized SingleTon getInstance() {// if (singleTon == null) {// 用到才创建// singleTon = new SingleTon();// }// return singleTon;// } public static SingleTon getInstance() {if (singleTon == null) {// 需要进入同步代码块synchronized (SingleTon.class) {// 同步代码块 锁只能唯一if (singleTon == null) {// 创建时必须的singleTon = new SingleTon();}}}return singleTon;}1.3.4. Android应用:TelephonyManager
系统服务一般用单例
优点:扩展性,灵活性
比方:笔记本电脑与鼠标适配器
public static void main(String[] args) {LenovoThinkPad t1 = new LenovoThinkPad();// usb 接口t1.setMouse(new LeiSheAdapterMouseAdapter());t1.setMouse(new LenovoMouseAdapter());t1.work();}2.1. Android应用:ListView
学习经验 对Adapter 设计的控件,着重着握的是 Adapter的重要方法的意义
private class NewAdapter extends BaseAdapter {// 决定列表的行数@Overridepublic int getCount() {return list.size();}// position指定下标// 按照下标返回数据实体@Overridepublic Object getItem(int position) {return list.get(position);}// 点击时当前项对应的id@Overridepublic long getItemId(int position) {return position;}// 决定列表的视图/外观// position对应下标@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//载入外观View itemView = View.inflate(getBaseContext(), R.layout.activity_item, null);//获取数据NewInfo info=list.get(position);//数据按照逻辑显示在视图TextView tilte=(TextView) itemView.findViewById(R.id.title);TextView desc=(TextView) itemView.findViewById(R.id.desc);tilte.setText(info.title);desc.setText(info.desc);return itemView;}}其他
Gallery,GridView,ViewPager
京东商城促销
低效:每隔一秒 查询所有数据,跟前一秒的数据进行比对
1.数量大的时候 10 100000000....
开发要点:1分清 Observable敏感数据变化的一方 2.Observer
需要依照传递过来的变化进行变化
DAO :Observable 1。设置可观察对象 extends Observable 2。以引起变化的代码处 // 设置变化点 setChanged();// 通知观察者notifyObservers("id=" + id + "price=" + price);//对象GoodService 依照变化开展业务1.设置成观察者 implements Observer2.实现方法 update方法// Object data 就是从Observable传播过来的变化@Overridepublic void update(Observable observable, Object data)3。把观察者加入到可观察对象里面 // 添加观察者dao.addObserver(this);
add.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {list.add(new NewInfo("标题" + System.currentTimeMillis(), "描述........" + System.currentTimeMillis()));// 通知ListView控件 集合个数改变 请刷新adapter.notifyDataSetChanged();System.out.println(list.size());}});3.2.2. ContentProvider经常用使用到
案例:监控电话记录 来电跟外拨
开发要点:1.权限
<!-- 读取通话记录 --> <uses-permission android:name="android.permission.READ_CALL_LOG" /> <!-- 读取联系人 --> <uses-permission android:name="android.permission.READ_CONTACTS" /> |
2.继取ContentObserver重写onChanged
采用观察设计模式方便别人只获取变化的数据,而不需要定时全部遍历
// 地址访问的是contacts2.dbUri uri = Uri.parse("content://call_log/calls/");// 注册一个内容观察者ObservergetContentResolver().registerContentObserver(uri, // 共享数据provider的地址true,// 增加数据时发出通知new CallLogContentObserver(new Handler())); }// 继承ContentObserverprivate class CallLogContentObserver extends ContentObserver {public CallLogContentObserver(Handler handler) {super(handler);}// 监听对象发生改变// 增加/删除 一条通话记录的时候触发@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);//事件处理}}4. 代码风格BS vs CS
j2EE 容器 解析配置文件 线程封装 代码 逐行 ------------------------------------------------------- Android 代码 非逐行 重点 设计理解 方法的执行条件 |
所有图形控件都是事件源.每个控件都有多个监听器,监听器的职责把事件转换成参数,提供给事件处理程序
特征setOn...Listener
学习重点的变化 :关注事件参数与事件处理
//事件源 Button add = (Button) findViewById(R.id.add); //添加监听器/侦听器: 作用:把事件转换成参数 提供给事件处理程序setOn...Listeneradd.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) { //事件处理程序代码}});
5.2. 参数的重要意义
如果没有position参数,那么你能处理以下事件吗?
listview.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView parent, View view, int position, long id) {// 事件处理程序 :把点击那项新闻的标题吐司出来NewInfo info = list.get(position);Toast.makeText(getBaseContext(), info.title, Toast.LENGTH_LONG).show();}});5.3. 事件的几种写法
add.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {System.out.println("----------我被点了------------");}});5.3.2. Implements方式
public class MainActivity2 extends Activity implements View.OnClickListener
This可以是多种类型
// instanceof判断类型的关键字if (this instanceof MainActivity2) {System.out.println("MainActivity");}if (this instanceof Activity) {System.out.println("Activity");}if (this instanceof View.OnClickListener) {System.out.println("View.OnClickListener");} if (this instanceof Context) {System.out.println("Context");} // this可能是多种类型号的add.setOnClickListener(this);
add.setOnClickListener(new AddListenr());// this可能是多种类型号的} private class AddListenr implements View.OnClickListener {@Overridepublic void onClick(View v) {System.out.println("点击事件的处理代码....");}}
android:onClick="属性值"
public void 属性值(View view) {
}
属性值跟方法名一致!!!
例:
public void update(View view) {}