★布局。
相对布局:
*停靠父控件边界(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学习笔记(一)