学习android开发中遇到的一些小问题
菜鳥的學習筆記:
(好多時候想著記錄一下自己花了好長時間解決的問題,但是一直沒有行動,某一天覺得記錄這種事情還是有意義的,雖然中間的記錄斷斷續續,也有時候忘記了記錄,覺得記錄一下也是自己的積累。)
?
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一起顯示。
總結
以上是生活随笔為你收集整理的学习android开发中遇到的一些小问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7-X64下用VM安装linux系
- 下一篇: 谷歌技术三宝之MapReduce