菜鸟的学习笔记:
(好多时候想着记录一下自己花了好长时间解决的问题,但是一直没有行动,某一天觉得记录这种事情还是有意义的,虽然中间的记录断断续续,也有时候忘记了记录,觉得记录一下也是自己的积累。)
1.mysqlite在eclipse中汉字的乱码问题
通过cmd shell命令录入的信息,在eclipse调试中显示乱码,为编码问题,要使录入信息与读取时编码方式一致,不知道mysqlite编码方式,所以都通过程序来录入和读取从而一致。
2013/3/20
百度定位api使用
1.注意区分1.3.5版本和2.0.0版本的区别。
2.0.0用import com.baidu.mapapi.map.*;
2.xml中MapView 为com.baidu.mapapi.map. MapView,而且必须在初始化BMapManager后再setContentView(R.layout.activity_offline_map);否则会出现无法调用组件MapView。
3/22
1.java中类不要设置全局参数,要将类写成独立的类。
2.控制主线最好只有一条。
2013/3/24
1.注意细节,当出现错误时先检查参数是否正确。
2.当调用百度地图时若不是显示灰色网格,则说明调用了地图,但是经纬度不对;出现灰色网格才是没有显示地图,可能是key的原因,也可能是BMapManager没有start()。
3.待处理问题,百度地图界面的update无法使用,没有响应locationupdatelistener
2012/3/25
1.将雷达图上层和下层的Bitmap合成一个,根据角度返回一个Bitmap,将Bitmap设置成ImageButton上的图片。在这中间合成了一个类,类里面有两个内部类,内部类的访问机制要了解,普通的内部类不能有static数据。
2012/3/26
1.ImageButton在使用时,当图片未得到的时候设置为gone可以不响应点击事件,当图片得到的时候再设置为visible。
2.assets中文件存储到手机sd卡cache中,以后少用root权限。
3. 学习java,每个.java文件中可以有很多类,但是只有一个public类。
2012/3/30
1.AlertDialog 可以用Xml文件布局,步骤如下:注意黄色部分
LayoutInflater locateMdLayout=LayoutInflater.from(LBSDemoActivity.this);
final View locateMdDialogView = locateMdLayout.inflate(R.layout.dialog_locate_method,null);
final CheckBox chooseGPRS = (CheckBox)locateMdDialogView.findViewById(R.id.dialog_network_check);
chooseGPRS.setChecked(sensorDataCollector.isUseNetwork());
2012/4/7
1.《设计模式》对抽象工厂、单件模式等有一些理解,还需要多看。
2012/4/11
1. manifest中各部分作用
http://www.cnblogs.com/Greenwood/archive/2011/06/13/2079957.html
2012/4/12
1.R.id.
http://blog.csdn.net/kmyhy/article/details/6583804
2012/4/17
1.如何要activity监听某个数据发生变化而做出响应?
可以写一个接口,activity implements这个接口,在override接口函数中做出响应。而在这个数据所在文件register这个接口,在发生变化的地方调用接口函数。
2.textview显示不出来的问题。
要把布局文件放于前面,xml定义为frameLayout,其他控件显示后再设定frameLayout.bringToFront();
3.toast布局。实例如下
View toastView = getLayoutInflater().inflate(R.layout.offmaps_toast,null);
TextView strucNameView = (TextView) toastView.findViewById(R.id.message);
strucNameView.getPaint().setFakeBoldText(true);
strucNameView.setTextColor(Color.argb(200, 0x88,0x00,0x00));
strucNameView.setTextSize(16);
Toast strucToast = new Toast(this);
strucToast.setGravity(Gravity.CENTER, 0, 0);
strucToast.setDuration(Toast.LENGTH_LONG);
strucToast.setView(toastView);
strucNameView.setText(strucName);
strucToast.show();
2013/4/23
1.利用Handler来实现UI的更新。在需要的地方sendmessage,在主界面写handleMessage即可。
2. getIntrinsicWidth()得到的不是图片的实际大小,而是视图上表现出来的宽度。改为相对布局后有所改善。
2013/4/26
1.getActionBar().getHeight()获得为0的问题,要在view加载完后再调用,否则为0。
2013/4/27
1.java 的GC(garbage collection)容易让人忽略内存泄露的问题。注意的方面有如下几点:
(1)能使用getApplicationContext()时,避免使用this。
在android中有两种context,一种是 application context,一种是activity context。
把activity context传递给view,意味着view拥有一个指向activity的引用,进而引用activity UI占有的资源:view , resource, SensorManager等。application context伴随application的一生,与activity的生命周期无关。不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的。
(2)查询数据库关闭游标。如下修改:
Cursor cursor = null;
cursor = db
.rawQuery("SELECT COUNT(*) FROM buptStrucData;",null);
if ((cursor !=null )&& (cursor.getCount() > 0)) {
cursor.moveToFirst();
return Integer.parseInt(cursor.getString(0));
}
if(cursor !=null){
try{
cursor.close();
}catch(Exception e){
e.printStackTrace();
}
}
(3)Bitmap在不使用时调用recycle()释放内存。
(4)释放对象的引用。当类内部引用了另一个类对象时,要记得释放对该对象的引用。
尽量使用静态类(全局),避免非静态的内部类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化。
(5)AlertDialog.Builder(this);因为用this,包含了对当前activity的引用,造成内存泄露。方法如下:在activity中添加
@Override
protected Dialog onCreateDialog(int id) {
switch(id){
case 1:
//新建的dialog 跟以前方法一样。
return builder.create();
}
}
在要显示的地方调用showDialog(1);
(6)构造Adapter时,没有使用convertView。
2.内存泄露查看方法,直接用eclipse中的DDMS->Heap点击运行的程序可以查看。
2013/4/28
1.activity生命周期的理解。
onPause:当另一个activity获得焦点或者切换到别的应用程序时,此时要释放资源。
onResume:当该activity重新获得焦点时,要初始化一些操作。将在onCreate中的一些操作移到onResume里来。
2.注意加一些保护措施,比如进行数据库查询时,先检查数据库是否打开,设置某个数据时查看是否为空,以防逻辑上的错误。
继续慢慢地学习着……
2013/5/3
1. 电信2G网络是CDMA,3G网络是CDMA2000,移动和联通的2G是GSM,移动3G是TD联通3G是WCDMA。不一样的网络基带不一样,不能通用。
5/7
1.android 内核 linux。为什么在android 上用java编程,java的平台无关性。
《android 内核剖析》
http://blog.csdn.net/yelbosh/article/details/8035356
java虚拟机 《深入理解JAVA虚拟机》
http://bbs.csdn.net/topics/390251794
5/8
1. 图片根据手机屏幕大小来显示
Bitmap zoomoutBmp = BitmapFactory.decodeResource(getResources(),
R.drawable.zoomout_normal);
int width = zoomoutBmp.getWidth();
int height = zoomoutBmp.getHeight();
float ratio = (float) dm.widthPixels / 1280 * 1.5f;
int newWidth = (int) (ratio * width);
int newHeight = (int) (ratio * height);
Bitmap zoomoutRizeBmp = Bitmap.createScaledBitmap(zoomoutBmp, newWidth,
newHeight,true);
BitmapDrawable zoomoutDrawable = new BitmapDrawable(zoomoutRizeBmp);
也可用matrix 来改变的时候出错:
Matrix matrix = new Matrix();
matrix.postScale(ratio, ratio);
Bitmap zoomoutRizeBmp = Bitmap.createBitmap(zoomoutBmp, 0, 0, width, height,matrix,true);
2.activity
finish();//调用finish将activity关闭,防止堆栈溢出
相当于按下back键,告诉 Activity Manager该Activity实例可以被“回收”。随后 Activity Manager 激活处于栈第二层的 Activity 并重 新入栈,把原 Activity 压入到栈的第二层,从 Running 状态转到 Paused 状态。
要实现任意activity的跳转要自己设计一个堆栈。
3. Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
模拟器的话增加模拟器内存。
手机时,内存不足。
5/9
1. error: Error parsing XML: unbound prefix
要加入:
xmlns:android="http://schemas.android.com/apk/res/android"
不能以absolutelayout 开头的标签
用<include>时要用<merge> 标签,避免嵌入重用组件。relativelayout 不能单独用。
2.异步执行任务,处理一些后台的比较耗时的任务。
AsyncTask的简单用法。
http://blog.csdn.net/cjjky/article/details/6684959
5/10
1.java jni
System.loadLibrary(*.so的档案名);
http://blog.csdn.net/conowen/article/details/7522667
2.NDK和Cygwin的安装和使用
注意Cygwin选择要下载的站点,http://mirrors.kernel.org比较快
5/13
1. 高通 Vuforia AR(增强现实) QCAR sdk
2. Java的synchronized 同步机制
(1)把synchronized当作函数修饰符时,锁定的是调用这个同步方法对象。
(2)同步块。当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(是个对象)来充当锁。private byte[] lock = new byte[0]; // 特别的instance变量
注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。
(3)将synchronized作用于static 函数。
与非static的不构成同步,因为锁不相同。对象名.getClass()与类名.class不同,前者得到Obj所属的对象,后者得到Obj所属的class。锁定时用后者能够锁class。
引申:定义private 的instance变量+ get方法,而不要定义public/protected的instance变量。假如将变量定义为public,对象在外界能够绕过同步方法的控制而直接取得他,并改变他。假如instance变量是个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了。
3.javadoc 使用
右键工程->export->java->javadoc
(1)编码GBK的不可映射字符,要在最后一步设置编码方式
-encoding utf-8 -charset utf-8
(2)软件包 android.view 不存在
将用到的jar包拷贝到“C:\Program Files\Java\jre6\lib\ext”(即jre的安装目录)下
(3)避免发生“导出javadoc的非法字符 \0或者 \65279”这样的错误,将发生错误的java文件用ultraedit打开后,另存为编码格式为 “UTF-8—无BOM”
4.eclipse 快捷键
http://blog.csdn.net/zwhfyy/article/details/4035390
5.javadoc 注释生成插件 JAutodoc
(1)安装:网上很难搜到,分别把下载的features和plugins下的文件拷贝到eclipse安装目录的features和plugins下。
(2)使用方法:http://bupter520.iteye.com/blog/773544
5/14
1.java单元测试方法
property-> add library->JUnit.jar
右键要测试的类,new->JUnit Test Case
http://ryxxlong.iteye.com/blog/649922
assertEquals();来比较运行后的值与所期望的值,如果相同则说明此函数正确。
2. JDK带的一些常用命令及其常用选项
http://blog.csdn.net/hemingwang0902/article/details/6660723
3.java ant
http://www.cnblogs.com/wufengxyz/archive/2011/11/24/2261797.html
5/15
1.this 不能放于static方法中,this代表当前对象
java中的main方法必须写成static的原因:在类加载时无法创建对象,而静态方法可以不通过对象调用,所以在类加载时就可以通过main方法入口来运行程序。
父类中是静态方法,子类中不能覆盖为非静态方法,在符合覆盖规则的前提下,在父子类中,父类中的静态方法可以被子类中的静态方法覆盖,但是没有多态。(在使用对象调用静态方法时其实是调用编译时类型的静态方法)
2.String \ StringBuffer\StringBuilder的区别
String:不可改变的Unicode字符序列,池化思想,把需要共享的数据放在池中,用一个存储区域来存放一些公用资源以减少存储空间的开销。在String类中,以字面值创建时,会到Java方法空间的串池中去查找,如果没有则会在串池里创建一个字符串对象,并返回其地址赋给对象变量,如果有就返回串池中字符串的地址,并把这个地址赋给对象变量。如果是new,则会在堆空间中创建String类的对象,不会有上述的过程。
StringBuffer:可改变的Unicode字符序列,允许并发操作,是线程安全的。String类在进行字符串连接时会显得效率很低,就是因为它所产生的对象的属性是不能够修改的,当连接字符串时也就只能创建新的对象。对于很多字符串连接时,应当使用StringBuffer类,使用这个类的对象来进行字符串连接时就不会有多余的中间对象生成,从而优化了效率。可如下使用:
String s = null;
StringBuffer sb = new StringBuffer("A");
sb.append("B");
sb.append("C");
sb.append("D");
s = sb.toString();
StringBulder: 可改变的Unicode字符序列,操作同StringBuffer,只是不支持并发操作,非线程安全的。
3. 单例设计模式:
一个类只允许有一个对象,保证所有引用的对象都是同一个对象。
因为只允许存在一个对象,则不允许在外面直接new出新的对象,所以应该把构造器设为private,。
在类内定义一个公开的静态方法,让使用者进行调用,通过该方法去获得一个实例。
例:
public calss Singleton{
private static Singleton s;
private Singleton(){}
public static Singleton newInstance(){
if ( s == null)
s = new Singleton();
return s;
}
}
4. List:有序(存放元素的顺序),可重复的集合
ArrayList:实质就是一个会自动增长的数组
查询效率比较高,增删的效率比较低,适用于查询比较频繁,增删动作较少的元素管理的集合。
加载大批量的数据时,先进行手动扩容(就是调用ensureCapacity(int minCapacity)方法),这样可以提高效率。
LinkedList:底层是用双向循环链表来实现的
查询效率低,但是增删效率很高,适用于增删动作的比较频繁,查询次数较少的元素管理的集合
Set:无序的,不允许有重复元素的集合
5.java中的反射:
类对象:描述一个类信息的对象,当虚拟机加载类的时候,就会创建这个类的类对象并加载该对象,Class是类对象的类型。
获得类对象的方式:
用" 类名.class "获得这个类的类对象。
用类的对象掉用getClass(),如object.getClass()得到这个对象的类型的类对象。
可以使用Class.forName(类名),也可以得到这个类的类对象,(注意,这里写的类名必须是全限定名(全名),是包名加类名,XXX.XXX.XXXX)。
基本类型也有类对象,用" 封装类.TYPE "可以获得对应的基本类型的类对象。
步骤:Obj.getClass -> method = Obj.getMethod -> method.invoke(Obj);
6. 成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列
在内部类中可以直接访问外部类的私有属性。
内部类和外部类的实例变量允许命名冲突。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性
在外部类的外部,要创建一个成员内部类对象,要首先建立一个外部类对象,然后再创建一个成员内部类对象。
Outer out = new Outer();
Outer.Inner in = out.new Inner();
在本类内部生成内部类对象的方式:
在静态方法中:Inner in = new Outer().new Inner();
在非静态方法中:Inner in = this.new Inner();
成员内部类不可以有静态成员,这是因为静态属性是在加载类的时候创建,这个时候内部类还没有被创建。
7.抽象类的子类继承一个函数时可以加入synchronized标志
如:在抽象类中public abstract int next();
在子类中 @Override
public synchronized int next() {
}
8.java的并发控制——多线程
(1)Future 与Callable配合使用得到线程的返回值。
http://blog.csdn.net/ghsau/article/details/7451464
(2)Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。比synchronized使用和执行成本更低。
当运算时间够长的时候线程调度机制才来得及介入,交换任务并关注优先级。
2013/7/6
1、actionbar上图标显示不出来
menu设置时:
always:菜单项一直显示在Action Bar上。
ifRoom:如果有足够的空间,菜单项显示在ActionBar上。
never:菜单项永远不出现在Action Bar上。
withText:菜单项和它的图标,title一起显示。