Android 基础理论 day01

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) {
}
 

发布了32 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u013621398/article/details/30542535