2012年12月2日 星期日

[Android] Touch events trigger order

  • ViewGroup#onInterceptorTouchEvent()
  • View#onTouchEvent()
  • View#onTouch()


目前了解

以上 method 回傳 true 則表示會處理 event,該 event 則不會再被 dispatcher

若是回傳 false,則表示不會處理,因此也不會再接收到後續 event (這邊有點不確定!)


* Reference
- onInterceptTouchEvent和onTouchEvent调用时序 - ddna的专栏 - 博客频道 - CSDN.NET
- ViewGroup | Android Developers
- MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序 | 第三极 | 移动开发者
- onTouchEvent 、onInterceptTouchEvent的顺序~
- 两分钟彻底让你明白Android中onInterceptTouchEvent与onTouchEvent(图文)! - Android_Tutor的专栏 - 博客频道 - CSDN.NET

Dynamic Random Access Memory (DRAM)

動態隨機存取記憶體 (Dynamic Random Access Memory,DRAM)
  • 是一種半導體記憶體,主要的作用原理是利用電容內儲存電荷的多寡來代表一個二進制位元(bit)是 1 還是 0。
  • 由於在現實中電容會有漏電的現象,導致電位差不足而使記憶消失,因此除非電容經常周期性地充電,否則無法確保記憶長存。
  • 與大部分的隨機存取記憶體(RAM)一樣,由於存在 DRAM 中的資料會在電力切斷以後很快消失,因此它屬於一種揮發性記憶體(volatile memory)設備。
  • 由於這種需要定時重新整理的特性,因此被稱為「動態」記憶體。


靜態記憶體 (SRAM)
  • 相對來說只要存入資料後,縱使不重新整理也不會遺失記憶。

  • 與 SRAM 相比,DRAM 的優勢在於結構簡單
    • 每一個位元的資料都只需一個電容跟一個電晶體來處理,而 SRAM 上一個位元通常需要六個電晶體。
    • 正因這緣故,DRAM 擁有非常高的密度,單位體積的容量較高因此成本較低。
  • 但相反的,DRAM也有存取速度較慢,耗電量較大的缺點。


Android relative API


* Reference
- 動態隨機存取記憶體 - 维基百科,自由的百科全书
- ActivityManager.MemoryInfo | Android Developers

[Android] Android NDK (Native Development Kit)

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?

[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模拟器无法启动的解决

2012年12月1日 星期六

[AndroidLayout] getWidth() and getHeight() return 0

getWidth()
取得 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控件的宽和高 **

練就堅強的心 只是一種習慣


<<練就堅強的心 只是一種習慣>>  植西聰

不是真的因為自己太差 卻因為自我要求 外在環境

而自我否定 陷入負面情緒

這本要說的便是如何擺脫負面思考 重建自信


  1. 學習放手 拋開憤怒與嫌惡記憶
  2. 放寬標準 不必急速當下解決
  3. 適時抒發 改變心情 另覓方法


但這本在似乎還沒上市XD

就像是 祕密 這本書 我相信信念所能帶來的影響

或許也是這樣 覺得很難去改變 所以始終沒有動力去了解與閱讀

正向的想法與樂觀 應該能帶來不同的思考

性格很難改變 就...一點點的養成習慣來修正吧!

嗯....



* Reference
- 【經理人月刊 3月號/2012 第88期】高績效主管的8堂必修課

[DesignPattern] Difference between Builder Pattern and Factory Pattern

Design Patterns 是更高階 (抽象) 的 patterns


Builder Pattern
  • 組裝場
  • for composite object


Factory Pattern
  • Create single object




[JPA] transaction annotation values

TRANSACTION
  • support: 依附 transaction 無則沒 transaction
  • required: 裡頭行為綁在一起, 一起成功/失敗
  • never: 行為分開獨立 有些成功 有些失敗

[Web] http request parameter

In http request
  • 沒有該 element: get null.
  • 有該 element 但沒有帶 value: get ""

[Android] adb memory command

adb shell dumpsys meminfo {packageName}

查看 {packageName} 的 memory 訊息

[AndroidLayout] status selector

<item android:state_selected="true" android:state_pressed="true"></item>

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)