博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 基础理论 day01
阅读量:803 次
发布时间:2019-03-25

本文共 5687 字,大约阅读时间需要 18 分钟。

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 {// 决定列表的行数@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

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 Observer2.实现方法  update方法// Object data 就是从Observable传播过来的变化@Overridepublic void update(Observable observable, Object data)3。把观察者加入到可观察对象里面  // 添加观察者dao.addObserver(this);

3.2. Android应用方面

3.2.1. Adapter 的更新列表

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

代码 非逐行

重点  

设计理解

方法的执行条件

5. 事件驱动模型/事件委托模块

 

5.1. 理解

所有图形控件都是事件源.每个控件都有多个监听器,监听器的职责把事件转换成参数,提供给事件处理程序

特征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. 事件的几种写法 

5.3.1. 匿名内部类

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);

5.3.3. 内部类的方式

add.setOnClickListener(new AddListenr());// this可能是多种类型号的} private class AddListenr implements View.OnClickListener {@Overridepublic void onClick(View v) {System.out.println("点击事件的处理代码....");}}

5.3.4. 通过属性配置

 android:onClick="属性值"

public void 属性值(View view) {

}

属性值跟方法名一致!!!

:

 

     public void update(View view) {}

 

你可能感兴趣的文章