Android学习笔记(一)

来源:互联网 发布:emule kad网络 编辑:程序博客网 时间:2024/05/22 02:11

★布局。

相对布局:

*停靠父控件边界(boolean) layout_alignParentTop(停靠父控件上边界); layout_alignParentRight ;layout_alignParentBottom;layout_alignParentLeft

*) 相对父控件居中(boolean) layout_centerHorizontal;layout_centerVertical ; layout_centerInParent

*) 对齐周围控件(指定ID) layout_alignTop ;layout_alignRight ;layout_alignBottom ;layout_alignLeft ;layout_alignBaseLine

*) 停靠周围控件(指定id) layout_above;layout_below;layout_toLeftOf; layout_toRightOf

线性布局:属性:◆orientation(方向,水平horiaental(默认)、vertical(纵向))

◆高度layout_height(或宽度layout_width)和比重layout_weight(控件按比例分配剩余空间)二者选一,设置weight(3),高度或宽度设为0dp);

◆layout_gravity(重力引力):水平布局中只能设置上(top)、中(center_vertial)、下(bottom);垂直布局:只能设置左(left)、中(center_horizental)、右(right);

表格布局:继承自线性布局,纵向排列;stretchColumns(拉伸到合适的列下标,传入1,2或列下标数)

帧布局:控件叠加显示(属性:layout_gravity:top、right、bottom、left、center、center_horizental、center_vertical)可两两组合使用属性(共9种),用|连接(如:中下:bottom|center_horizental)[主要用于滑入的菜单框]

★layout_marginBottom:xxdp;上下偏移偏移量,在程序中通过修改偏移量即可实现动画的效果;(包括marginTop、marginLeft、marginRight等)

网格布局:

◆columnCount:最大的列数;

◆layput_column:指定控件在第几列;

◆:留白(用于某个控件不显示,用空白进行填充);

◆layout_columnSpan:跨n列,但不拉伸,需用layout_gravity=fill_horizontal拉伸;

◆rowSpan:跨n行,用gravity=fill_vertical拉伸;

★[通用属性]

◆外边距:margin(四边一起设置)、marginTop、marginRight、marginBottom、marginLeft;

◆内边距:padding(四边一起设置)、paddingTop、paddingRight、paddingBottom、paddingLeft;

◆设置控件内部重力引力(控制控件内的内容):gravity(区别于layout_geavity:设置当前控件相对于父控件的重力引力(控制控件本身));

◆match_parent:匹配父容器大小;wrap_content:自适应内容;

◆背景:background;

◆是否为单行:boolean singLine;

★Android res目录:

是一个资源目,包括:

◆图片; 布局资源; 文本、数组、颜色资源; 未编译的资源;

◆values 用于文本国际化(I18N):不同国家地区的用户。可使用本地文字;

values-zh-rCN:中国大陆;valures-zh-rHK:中国香港;values-en-rUS:美国;

◆资源访问工具:Resource;获得Resource实例:

getRessources();

getString(id);

getInteger(资源id);

★raw文件:原始格式的文件,不会被压缩(编译);默认没有,须在res文件夹下创建。只能读;对同一个资源若需国际化则放置在此文件夹中,并设定不同国家的文件夹。

手机中默认编码为UTF-8;

打开Raw文件输入流,用Resource的getResource. openRawResource(id);返回一个InputStream;可用一个BufferedReader接收,但必须指定编码,new BufferedReader(new InputStreamReader(in,”GBK”));

★assets目录。资产

允许存放任意的文件、文件夹;但不会生成资源访问id;提供了专门的方法来获得文件输入流划列出文件列表;只能读出,不能写入;也不会被编译;

获得资产访问工具:String[]getAsset().list(path):获得子目录中的文件名称列表;getAsset().open(文件路径)、.open(文件、mode):获得文件输入流;[mode为固定参数:MODE_PRIVATE(默认):私有,只允许当前应用使用;……]

(此处assets即为相对根目录,注意添加“/”问题)。

先把Asset文件复制到SD卡,才可进行更改和访问;

★Appliaction

在应用启动时,系统自动创建Application实例,并调用它的onCreat()方法。但系统默认的Application的onCreat()方法没有代码;

可继承Application,重写onCreat()方法,在应用启动时,执行自定义的一段代码。(多用于连网,初始化界面,拷贝数据等)

使用步骤:

继承并重写Application的onCreat方法

在清单中配置:在application中添加 name=”创建的类名”;在应用一启动就执行。

进程。在操作系统中,并行执行的任务。

线程。在进程内部并行的任务。

java中创建线程的两种方式:

●继承Thread;启动后直接执行内部代码;不可共享数据;

●实现Runnable接口;可放到其他线程中去执,new Thread(new runable).start()。可共享数据;

线程调度器。负责在多个线程间切换执行,为线程分配时间片;线程间竞争的关系;

线程状态。new runnable running block(阻塞态) dead(消亡态,不能再启动);

线程在.start()后进入了runnable()后不一定就马上执行,只是进行了可运行态。

线程作用:

§将大的任务,切分为多个并行子任务;

§阻塞的代码要与其他代码并行;

§间隔执行的任务;

[sleep()和yield()是主动暂停和让出cpu,而interrupt()是被动打断、join()是被动暂停去执行另外调用此方法的线程。yield是让步给优先级相同的线程,若没有相同或更高优先级的线程则继续执行。]

◆推荐使用Runnable接口,还可继承其他类。

◆线程优先级越高,获得执行的机会就越多,但尽可能使用常量。

多线程共享数据。一个线程正在修改数据,另一个线程同时访问数据;

守护线程:

[守护线程即是将当前线程作为后台线程,一直执行,当其他线程结束时可不关闭这个线程直接退出。]

使用守护线程的时机:定时备份、计时器、GC-垃圾回收器;

.join()

在将一个计算分成若干个线程分别执行时,必须为每个线程争取到资源,故须加.join()方法,否则结果会不正确。可放到线程池中去执行。

t1.join():等待调用该方法的线程结束后再继续执行本线程;在多个相同线程同时启动时就对每个线程调用此方法,用于平均每个线程的cpu操作时间,否则易出错。

★synchronized标记。同步标识,可修饰方法、代码块,但不能修饰构造器,属性;

让一个代码块执行完后再去执行另外一个代码块,过程为:加锁-修改-释放锁。其作用是多线程共享数据时的数据安全。有一个synchronized标识就会创建一个监视器。

◆将会产生争夺的资源作为synchronized的锁。

◆一个线程执行到synchronized代码块时,必须先获得得到同步锁才能执行;

◆如果得不到同步锁,必须在synchronized代码块前等待;

◆非静态的同步方法(同步方法的同步锁为其本身this):获得当前对象的锁;

◆静态的同步方法:获得“类对象”的锁;

◆同步的代码块:synchronized(对象){.同步代码、集合.};

◆获得指定对象的锁:this、类对象、存在访问的数据对象、专门当作锁的对象;

线程安全:StringBuffer、Vector、HashTable

线程不安全:StringBuilder、ArrayList、HashMap

[线程安全是因为所有的方法加了synchronized关键字;对线程不安全的类、方法可加上synchronized关键字即成线程安全;但线程安全效率低,仅用于多线程时。]

★生产者消费者问题。

一种线程间通信

等待和通知机制。当生产者生产过多,若中间容器放满时就让生产者暂停等待一会儿,在中间容器上添加:wait();否则中间容器还可放了时就通知生产者继续生产,在中间容器上添加:notifyAll();消费者类似。

◆wait()外面总是一个循环判断 ,以对并发下的访问处理;

在等待wait()、通知notify()外面,必须有一个synchronized以创建一个监视器,在监视器中才可等待和通知。在执行wait()等待时会释放锁。

★线程本地共享ThreadLocal(绑定):在当前线程上,可以绑定一个数据,

当执行到后面组件代码时,可从当前线程获得数据

方法:

◆set(数据) 在当前线程绑定数据

◆get() 从当前线程获取数据

◆remove() 从当前线程移除数据

线程工具类。

Timer / TimerTask:计时任务,用来执行定时任务,或间隔任务。

timer.schedule(new TimeTask(){..},..)

★线程池。典型使用:

ExecutorService pool = Executors.newCachedThreadPool();//创建一个线程池for (inti = 0; i < 10000; i++) {pool.execute(new runnable(i));  //把任务放入线程池,自动执行。}ExecutorService pool = Executors.newFixedThreadPool(3);//放入三个线程

●在异步任务中也提供了线程池:

Executor pool = AsyncTask.SERIAL_EXECUTOR; //不定线程数

Executor pool= AsyncTask.THREAD_POOL_EXECUTOR; //包含5个线程;足够;

Android都是单线程模型。所有的界面显示、用户操作、组件控制,必须在主线程执行。

◆若在主界面中处理大量运算超时后会出现ANR。

[ANR :Application Not Responding 应用无响应。主线程执行时,程序阻塞在一段代码中。主线程无法更新界面显示,也无法响应用户的其他操作;用户在界面点击后5秒后无响应就也弹出ANR;]

Android线程通信。如须在工作线程中要更新界面显示,要向主线程发送消息。自己定义的工作线程不能更新UI界面,只有在主线程中才能更新。

原文地址:Android学习笔记(一)

0 0
原创粉丝点击