Android NDK (Native Development Kit)
能透過 java 直接呼叫 c 程式所做功能的工具。
Android SDK
是 google 提供 developers 開發的 Java-based API,app 會被執行在 Dalvik virtual machine,類似於 JVM,app 可以在任何裝置上執行,不受硬體 CPU 影響。
這樣 app 的執行速度相對於直接使用 C 來控制慢,尤其是影音方面的運算。所以有了 NDK,透過 NDK 可以直接操作底層功能加快執行速度。
因此形成主程式使用 Java,有速度上要求部份的如驅動程式、繪圖功能則使用 C;Android system 可分為 Java - JNI - C,透過 JNI(java native interface) 間接 Java 與 C
* Reference
- 49歐姆 整機教學: android HAL 層與 android NDK
- 49歐姆 整機教學: android HAL 硬體抽象層
- 49歐姆 整機教學
- What is the NDK?
2012年12月2日 星期日
[AndroidTool] Could not open: C:\Users – Android could not start Emulator
Error Message
PANIC: Could not open: C:\Users – Android could not start Emulator
Solution
因為 emulator 預設被建立在 C:\Users\.....\.android/avd
所以若該路徑下找不到會無法啟動
* Reference
- PANIC: Could not open: C:Users – Android could not start Emulator | Share ChiWai/Share 智慧/智慧分享 – 技術分享/Tech Blog
- 李辉的博客 » android模拟器无法启动的解决
PANIC: Could not open: C:\Users – Android could not start Emulator
Solution
因為 emulator 預設被建立在 C:\Users\.....\.android/avd
所以若該路徑下找不到會無法啟動
* Reference
- PANIC: Could not open: C:Users – Android could not start Emulator | Share ChiWai/Share 智慧/智慧分享 – 技術分享/Tech Blog
- 李辉的博客 » android模拟器无法启动的解决
2012年12月1日 星期六
[AndroidLayout] getWidth() and getHeight() return 0
getWidth()
取得 view 的實際所佔寬度。
getMeasuredWidth()
view 在 parent 估計會佔的寬度,是最近一次在 measure() 中計算的值。
Solution1
Solution2
[AndroidLayout] getWidth() and getHeight()
* Reference
- getWidth和getMeasuredWidth的正解 - rui313的专栏 - 博客频道 - CSDN.NET
- android - How do you to retrieve dimensions of a view? Getheight() and Getwidth() always return zero - Stack Overflow
- Android初级教程_获取Android控件的宽和高 **
取得 view 的實際所佔寬度。
getMeasuredWidth()
view 在 parent 估計會佔的寬度,是最近一次在 measure() 中計算的值。
Solution1
final TextView tv = (TextView)findViewById(R.id.image_test);
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
LayerDrawable ld = (LayerDrawable)tv.getBackground();
ld.setLayerInset(1, 0, tv.getHeight() / 2, 0, 0);
ViewTreeObserver obs = tv.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
}
});
Solution2
[AndroidLayout] getWidth() and getHeight()
* Reference
- getWidth和getMeasuredWidth的正解 - rui313的专栏 - 博客频道 - CSDN.NET
- android - How do you to retrieve dimensions of a view? Getheight() and Getwidth() always return zero - Stack Overflow
- Android初级教程_获取Android控件的宽和高 **
練就堅強的心 只是一種習慣
<<練就堅強的心 只是一種習慣>> 植西聰
不是真的因為自己太差 卻因為自我要求 外在環境
而自我否定 陷入負面情緒
這本要說的便是如何擺脫負面思考 重建自信
- 學習放手 拋開憤怒與嫌惡記憶
- 放寬標準 不必急速當下解決
- 適時抒發 改變心情 另覓方法
但這本在似乎還沒上市XD
就像是 祕密 這本書 我相信信念所能帶來的影響
或許也是這樣 覺得很難去改變 所以始終沒有動力去了解與閱讀
正向的想法與樂觀 應該能帶來不同的思考
性格很難改變 就...一點點的養成習慣來修正吧!
嗯....
* Reference
- 【經理人月刊 3月號/2012 第88期】高績效主管的8堂必修課
[DesignPattern] Difference between Builder Pattern and Factory Pattern
Design Patterns 是更高階 (抽象) 的 patterns
Builder Pattern
Factory Pattern
Builder Pattern
- 組裝場
- for composite object
Factory Pattern
- Create single object
[JPA] transaction annotation values
TRANSACTION
- support: 依附 transaction 無則沒 transaction
- required: 裡頭行為綁在一起, 一起成功/失敗
- never: 行為分開獨立 有些成功 有些失敗
[AndroidLayout] status selector
<item android:state_selected="true" android:state_pressed="true"></item>
selector status 的判斷 是在行為發生時生效
若想維持該狀態下的設定
可藉 APIs
button.setEnabled(true);
button.setSelected(false);
設定 widgets 的狀態 以固定 selector 中的對應結果
selector status 的判斷 是在行為發生時生效
若想維持該狀態下的設定
可藉 APIs
button.setEnabled(true);
button.setSelected(false);
設定 widgets 的狀態 以固定 selector 中的對應結果
[AndroidNet] IllegalArgumentException when http request
Error Message
java.lang.IllegalArgumentException: Illegal character in fragment at index 77: http://host/~!@#@#@$^%^%&2
at java.net.URI.create(URI.java:769)
at org.apache.http.client.methods.HttpPost.(HttpPost.java:79)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
at java.lang.Thread.run(Thread.java:1020)
Solution
request url + URLEncoder.encode(parameters)
java.lang.IllegalArgumentException: Illegal character in fragment at index 77: http://host/~!@#@#@$^%^%&2
at java.net.URI.create(URI.java:769)
at org.apache.http.client.methods.HttpPost.
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
at java.lang.Thread.run(Thread.java:1020)
Solution
request url + URLEncoder.encode(parameters)
2012年10月21日 星期日
[Android] Avoid Memory leak
- 當記憶體不足,system 就必須暫停你的 application,執行 garbage collection,通常暫停的時間很短暫讓 user 感覺不到,但若是在移動 scroll 或是遊戲戰鬥中,可以感覺到效能和回應的下降。
- "leak" meaning you keep a reference to it thus preventing the GC from collecting it.
- 在 Android 中,一個 Process 只能使用 16M 記憶體(模擬器為 8M?),若是超過變會引發 Out-of-Memory exception(OOM)。
容易占據大量記憶體的行為:
- view layout
- drawing method of a view
- the logic code of a game
Context Leak
keeping a long-lived reference to a Context.
Context 最常用來載入和存取資源,在 app 中一般會有 Activity and Application 兩種 Context
- setContentView(new TextView(this));
- 表示 the entire View hierarchy and all its resources reference 到這個 activity,有可能會使得此 Context leak。
可用以下兩種方式避免 Context leak:
- 不要將 Context 使用在自己的 scope 之外。
- 使用 Application context。
- This context will live as long as your application is alive and does not depend on the activities life cycle.
- If you plan on keeping long-lived objects that need a context, remember the application object. You can obtain it easily by calling Context.getApplicationContext() orActivity.getApplication().
In summary, to avoid context-related memory leaks, remember the following:
- Do not keep long-lived references to a context-activity (a reference to an activity should have the same life cycle as the activity itself)
- Try using the context-application instead of a context-activity
- Avoid non-static inner classes in an activity if you don't control their life cycle, use a static inner class and make a weak reference to the activity inside.
- The solution to this issue is to use a static inner class with a WeakReference to the outer class, as done in ViewRoot and its W inner class for instance
- A garbage collector is not an insurance against memory leaks
Bitmap Leak
- 避免 Bitmap Leak 就必須使用 recycle 機制,適時的將不需要顯示的 Bitmap 物件回收。
- 但還有另一種狀況: 產生 Bitmap 的時候,明明還有許多記憶體,卻發生了 OOM。
- 假設現在產生了一個 13MB 的 Int array 物件,在使用完之後立即 recycle,照理說會空出 13MB 的空間,這時候繼續產生一個 10MB 的 Int array 物件不會有任何問題,反而生成一個 4MB 的 Bitmap 卻跳出OOM。
- 在 Android 中,一個進程的記憶體可以由 2 個部門組成:Java 使用記憶體,C使用記憶體。
- 這兩個記憶體的和必需小於 16 MB,不然就會出現 OOM。
- 而分配給 Java 使用的記憶體,縱使這塊記憶體被釋放了,也還是只能給Java的使用,所以就算釋放 Java 佔用的佔用了一個大塊記憶體,C 能使用的記憶體 = 16M - Java 某一瞬間占用的最大記憶體。
- 而 Bitmap 的生成是路程經過過程 malloc 進行記憶體分配的,佔用的是 C 的記憶體,這個也就說明了,上面所說的的 4MB Bitmap無法生成的原因,因為在 13MB 被Java用過後,剩下 C 能用的只有 3M 了。
補救方式
- 使用 BitmapFactory.decodeStream() 產生Bitmap。
- 儘量不要使用 setImageBitmap,setImageResource 或 BitmapFactory.decodeResource 來設置一張大圖,因為這些函數在完成 decode 後,最終都是通過 java 層的 createBitmap 來完成的,需要消耗更多記憶體。
- 因此,改用先通過 BitmapFactory.decodeStream 方法,創建出一個 bitmap,再將其設為 ImageView 的 source,decodeStream 最大的秘密在於其直接調用 JNI >> nativeDecodeAsset() 來完成 decode,
- 無需再使用 java 層的 createBitmap,從而節省了 java 層的空間。
- decodeStream 直接拿的圖片來讀取位元組碼了,不會根據機器的各種解析度來自動適應,使用了 decodeStream 之後,需要在 hdpi 和 mdpi,ldpi 中配置相應的圖片資源,否則在不同解析度機器上都是同樣大小(圖元點數量),顯示出來的大小就不對了。
- 設定圖片的 Config 參數,可以跟有效減少載入的記憶體。
- BitmapFactory.Options inSampleSize:值越大解析度越小,佔用memory也越小。
- 在 onPause/onStop/onDestory 時, 將沒用到的 Bitmap release(用recyle())
BitmapFactory.Options opts = new BitmapFactory.Options(); // Options 只保存图片尺寸大小,不保存图片到内存 // 缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数 // SDK 中建议其值是2的指数值,值越大会导致图片不清晰 opts.inSampleSize = 4; Bitmap bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts); ... //回收 bmp.recycle();
* Reference
- Tracking Memory Allocations | Android Developers
- Avoiding memory leaks | Android Developers Blog
- (转)内存溢出的解决办法 Android - 攀升·Uranus - C++博客
- Android開發——解決載入大圖片時記憶體溢出的問題 @ 資訊園 :: 痞客邦 PIXNET ::
- GiveMePasS’s Android惡補筆記: 如何改善Bitmap所帶來的Out of Memory(OOM)問題
- Re: [問題] Bitmap OutOfMemory 永遠的痛 - 看板 AndroidDev - 批踢踢實業坊
- Andorid , Object-C and Java Programming Learning: [Android]Android Out Of Memory(OOM) 的詳細研究
2012年10月20日 星期六
[Android] Dialog error - Unable to add window token null is not for an application
Error Message
Unable to add window token null is not for an application
Occurred when
使用 getApplication() 去建立 dialog,必須使用 Activity (extends Context) 才行。
* Reference
- AlertDialog显示错误 Unable to add window token null is not for an application - Trinea @Java @Android 体验 技术 营销 - ITeye技术网站
Unable to add window token null is not for an application
Occurred when
使用 getApplication() 去建立 dialog,必須使用 Activity (extends Context) 才行。
* Reference
- AlertDialog显示错误 Unable to add window token null is not for an application - Trinea @Java @Android 体验 技术 营销 - ITeye技术网站
[javascript] Different result of String.length for browsers
javascript 中使用 String.length
Solution
在 IE 中,先將 \r\n replace 為 \n 再取得 length。
- chrome, FF
- 換行視為 \n => 1 字元
- IE
- 換行視為 \r\n => 2 字元
Solution
在 IE 中,先將 \r\n replace 為 \n 再取得 length。
2012年10月16日 星期二
[Android] layout qualifier
ex: In API 3.1
layout resource...
cannot use layout-xlarge-w720dp!
layout resource...
- only in layout-w720dp -> crash
- only in layout-xlarge -> ok (3.2 also ok)
cannot use layout-xlarge-w720dp!
訂閱:
文章 (Atom)