1. SingleTon模式
1.1. Static
载入时间
Static 属于类 唯一性
static代码块>构造方法 懒汉跟饿汉
1.2. 单例设计模式
三要素
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 地址比方:学员在教室里面的座位 |
1.3. 优化 饿汉跟懒汉
1.3.1. 饿汉:上来就搞对象,太饿了
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.3.3. 线程安全
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
系统服务一般用单例
2. Adapter设计模式
优点:扩展性,灵活性
比方:笔记本电脑与鼠标适配器
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 {
// 决定列表的行数
@Override
public int getCount() {
return list.size();
}
// position指定下标
// 按照下标返回数据实体
@Override
public Object getItem(int position) {
return list.get(position);
}
// 点击时当前项对应的id
@Override
public long getItemId(int position) {
return position;
}
// 决定列表的视图/外观
// position对应下标
@Override
public 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
3. Observer设计模式
京东商城促销
低效:每隔一秒 查询所有数据,跟前一秒的数据进行比对
1.数量大的时候 10 100000000....
3.1. Java.方面
开发要点:1分清 Observable敏感数据变化的一方 2.Observer
需要依照传递过来的变化进行变化
DAO :Observable
1。设置可观察对象 extends Observable
2。以引起变化的代码处
// 设置变化点
setChanged();
// 通知观察者
notifyObservers("id=" + id + "price=" + price);//对象
GoodService 依照变化开展业务
1.设置成观察者 implements Observer
2.实现方法 update方法
// Object data 就是从Observable传播过来的变化
@Override
public void update(Observable observable, Object data)
3。把观察者加入到可观察对象里面
// 添加观察者
dao.addObserver(this);
3.2. Android应用方面
3.2.1. Adapter 的更新列表
add.setOnClickListener(new OnClickListener() {
@Override
public 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.db
Uri uri = Uri.parse("content://call_log/calls/");
// 注册一个内容观察者Observer
getContentResolver().registerContentObserver(uri, // 共享数据provider的地址
true,// 增加数据时发出通知
new CallLogContentObserver(new Handler()));
}
// 继承ContentObserver
private class CallLogContentObserver extends ContentObserver {
public CallLogContentObserver(Handler handler) {
super(handler);
}
// 监听对象发生改变
// 增加/删除 一条通话记录的时候触发
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//事件处理
}
}
4. 代码风格BS vs CS
j2EE 容器 解析配置文件 线程封装 代码 逐行 ------------------------------------------------------- Android 代码 非逐行 重点 设计理解 方法的执行条件 |
5. 事件驱动模型/事件委托模块
5.1. 理解
所有图形控件都是事件源.每个控件都有多个监听器,监听器的职责把事件转换成参数,提供给事件处理程序
特征setOn...Listener
学习重点的变化 :关注事件参数与事件处理
//事件源
Button add = (Button) findViewById(R.id.add);
//添加监听器/侦听器: 作用:把事件转换成参数 提供给事件处理程序
setOn...Listener
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//事件处理程序代码
}
});
5.2. 参数的重要意义
如果没有position参数,那么你能处理以下事件吗?
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public 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. 事件的几种写法
5.3.1. 匿名内部类
add.setOnClickListener(new View.OnClickListener() {
@Override
public 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);
5.3.3. 内部类的方式
add.setOnClickListener(new AddListenr());
// this可能是多种类型号的
}
private class AddListenr implements View.OnClickListener {
@Override
public void onClick(View v) {
System.out.println("点击事件的处理代码....");
}
}
5.3.4. 通过属性配置
android:onClick="属性值"
public void 属性值(View view) {
}
属性值跟方法名一致!!!
例:
<Button
android:onClick="update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新" />
public void update(View view) {
}