繼上一篇︰Android開發之氣死人之路I後,
這是我第2起案例,一模一樣的程式碼
跑在Android手機上的結果不同
This is my second case , programming is the same, but result in two different status.
Difficult way to develop Android program.
狀況︰
我希望將訊息通知設在上方的"進行中",而非下方的通知欄位。
用了相同method函式請求,卻產出不同結果。
下一篇(完)︰Android開發者應有的認知
Thursday, July 15, 2010
計算機概論
CPU其實內部已經含有一些小指令集,我們所使用的軟體都要經過CPU內部的微指令集來達成才行。
世界上常見到的兩種主要CPU種 類: 分別是精簡指令集(RISC)與複雜指令集(CISC)系統。
CPU的種類 | 精簡指令集(RISC) | 複雜指令集(CISC) | ||||||||||||
優點 | 指令的執行時間都很短 完成的動作也很單純 指令的執行效能較佳 | 每個小指令可以執行一些較低階的硬體操作 | ||||||||||||
缺點 | 複雜的事情, 就要由多個指令來完成。 | 指令數目多而且複雜 | ||||||||||||
使用的公司 |
| AMD、Intel、VIA |
0/1 的單位我們稱為 bit。但 bit 實在太小了, 並且在儲存資料時每份簡單的資料都會使用到 8 個 bits 的大小來記錄,因此定義出 byte 這個單位,他們的關係為:
1 Byte = 8 bits
時脈就是CPU每秒鐘可以進行的工作次數。 所以時脈越高表示這顆CPU單位時間內可以作更多的事情。舉例來說,Intel的Core 2 Duo型號E8400的CPU時脈為3.0GHz, 表示這顆CPU在一秒內可以進行3.0x109次工作,每次工作都可以進行少數的指令運作之意。
不同的CPU之間不能單純的以時脈來判斷 運算效能喔!這是因為每顆CPU的微指令集不相同,時脈目前僅能用來比較同款CPU的速度!
主機板晶片組如何進行各個電腦元件之間的溝通?這個時候就需要用到所謂的I/O位址與IRQ囉!
I/O位址有點類似每個裝置的門牌號碼,IRQ可以想成是各個門牌連接到郵件中心(CPU)的專門路徑囉!
CMOS主要的功能為記錄主機板上面的重要參數, 包括系統時間、CPU電壓與頻率、各項設備的I/O位址與IRQ等,由於這些資料的記錄要花費電力,因此主機板上面才有電池。 BIOS為寫入到主機板上某一塊 flash 或 EEPROM 的程式,他可以在開機的時候執行,以載入CMOS當中的參數, 並嘗試呼叫儲存裝置中的開機程式,進一步進入作業系統當中。
文字編碼系統
當我們要寫入檔案的文字資料時,該文字資料會由編碼對照表將該文字轉成數字後,再存入檔案當中。 同樣的,當我們要將檔案內容的資料讀出時,也會經過編碼對照表將該數字轉成對應的文字後,再顯示到螢幕上。 現在你知道為何瀏覽器上面如果編碼寫錯時,會出現亂碼了嗎?這是因為編碼對照表寫錯, 導致對照的文字產生誤差之故啦!
big5碼的中文字編碼對於某些資料庫系統來說是很有問題的,某些字碼例如『許、蓋、功』等字, 由於這幾個字的內部編碼會被誤判為單/雙引號,在寫入還不成問題,在讀出資料的對照表時, 常常就會變成亂碼。不只中文字,其他非英語系國家也常常會有這樣的問題出現啊!
為了解決這個問題,由國際組織ISO/IEC跳出來制訂了所謂的Unicode編碼系 統, 我們常常稱呼的UTF8或萬國碼的編碼就是這個咚咚。因為這個編碼系統打破了所有國家的不同編碼, 因此目前網際網路社會大多朝向這個編碼系統在走,所以各位親愛的朋友啊,記得將你的編碼系統修訂一下喔!
你要讓DVD影片能夠放映, 那就得要參考DVD光碟機的硬體資訊才行。
作業系統(Operating System, OS)其實也是一組程式, 這組程式的重點在於管理電腦的所有活動以及驅動系統中的所有硬體。
Monday, July 12, 2010
Servlet initiate parameter
Servlet在建立時,有一個生命週期
而在建立一個Servlet的一開始,會先做一些初始化的動作,
而這些動作,是在web.xml裡去設定的...
如下圖,我們要在初始時,就將要印出來的table border設為2,而顏色設為藍色,web container會在建立Servlet的一開始,就在:ServerletConfig做設定
------------------------------------------------------------------
當我們要攢寫一個新的Servlet時,我們必須要繼承HttpServlet。但是我們的初始化設定在HttpServlet的父父類別(ServletConfig), 也就是在"阿公"這一代,就已經設定了。
---------------------------------------------------------------------
init()方法,在Servlet建立的初時,只會被呼叫1次,僅1次。
原來我們不是只在web.xml做<init-param>設定就好,還要在我們新寫的Servlet裡,呼叫阿公的method:init(),並使用getInitParameter去把web.xml裡的值叫出來做對應,才算正式的完成初始化。
---------------------------------------------------------------------------
初始化完就結束了?
這個答案是否定的,因為你還沒下參數來"使用"。
下了
而在建立一個Servlet的一開始,會先做一些初始化的動作,
而這些動作,是在web.xml裡去設定的...
如下圖,我們要在初始時,就將要印出來的table border設為2,而顏色設為藍色,web container會在建立Servlet的一開始,就在:ServerletConfig做設定
------------------------------------------------------------------
當我們要攢寫一個新的Servlet時,我們必須要繼承HttpServlet。但是我們的初始化設定在HttpServlet的父父類別(ServletConfig), 也就是在"阿公"這一代,就已經設定了。
---------------------------------------------------------------------
init()方法,在Servlet建立的初時,只會被呼叫1次,僅1次。
原來我們不是只在web.xml做<init-param>設定就好,還要在我們新寫的Servlet裡,呼叫阿公的method:init(),並使用getInitParameter去把web.xml裡的值叫出來做對應,才算正式的完成初始化。
---------------------------------------------------------------------------
初始化完就結束了?
這個答案是否定的,因為你還沒下參數來"使用"。
下了
out.println("<table border='" + borderSize + "' bordercolor='" + borderColor + " ' >");
才算真的完成格式的載入。Sunday, July 11, 2010
實體繼續導向
在一般的網頁中,如果要將第1個網頁跳轉到第2個網頁,也許我們會在doPost()下 response.sendRedirect("第2個網頁.view");指令。
但是,這在第2個網頁,會發生requests和response為null的冏境。
下面的圖示,TellMeServlet.java是第1個網頁,而HelloServlet.java是第2個網頁。
原來在從who_are_you.html裡傳給TellMeServlet的request和reponse,在回傳給user的browser之後,再遇到response.sendRedirect("hello.view");時,這個時候的request和reponse都被清空了。
---------------------------------------------------------------------------------------------------------
解決的辦法當然是有,利用RequestDispatcher。
這樣子request和response物件就順利丟到第2個網頁了
但是,這在第2個網頁,會發生requests和response為null的冏境。
下面的圖示,TellMeServlet.java是第1個網頁,而HelloServlet.java是第2個網頁。
原來在從who_are_you.html裡傳給TellMeServlet的request和reponse,在回傳給user的browser之後,再遇到response.sendRedirect("hello.view");時,這個時候的request和reponse都被清空了。
---------------------------------------------------------------------------------------------------------
解決的辦法當然是有,利用RequestDispatcher。
這樣子request和response物件就順利丟到第2個網頁了
Saturday, July 10, 2010
1.web.xml
web.xml是替servlet做設定的功能
會分別加入
1.<servlet></servlet>
再在裡面加入
(1) <servlet-name>替servlet取的名稱</servlet-name>
(2) <servlet-class>servlet的路徑</servlet-class>
2. <servlet-mapping></servlet-mapping>
在裡面再加入
(1) <servlet-name>servlet的名稱</servlet-name>
(2) <url-pattern> 替這個servlet取上url</url-pattern>
以下是上述的實際輸出程式碼
會分別加入
1.<servlet></servlet>
再在裡面加入
(1)
(2)
2. <servlet-mapping></servlet-mapping>
在裡面再加入
(1)
(2) <url-pattern>
以下是上述的實際輸出程式碼
<servlet>
<servlet-name>MyFirstServlet</servlet-name>
<servlet-class>servlets.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet</servlet-name>
<url-pattern>/my_first_servlet.view</url-pattern>
</servlet-mapping>
Friday, July 9, 2010
Friday, July 2, 2010
Saturday, June 26, 2010
將自己設計xml的Layout轉成View:LayoutInflater
一般來講,我們用LayoutInflater做一件事:inflate
inflate這個方法總共有四種形式,目的都是把xml表述的layout轉化為View。其中只有一個我個人比較常用,View inflate(int resource, ViewGroup root),另外三個,其實目的和這個差不多。這裡簡單說一下它的用法,相信已經開始實踐的人都差不多用過了。
int resource,也就是resource/layout文件在R文件中對應的ID,這個必須指定。而ViewGroup root則可以是null,null時就只創建一個resource對應的View,不是null時,會將創建的view自動加為root的child。
問題就是為什麼要調用inflate(),而不是用setContentView()讓它自己去inflate?
setContentView()一旦調用, layout就會立刻被貼上UI。而inflate只會把Layout形成一個以view類實現成的對象。到時若有需要時再用 setContentView(view)把它貼上。
以上內容轉載至eoeAndroid論壇
==========================================
一般來講,我們用LayoutInflater做一件事:inflate。 inflate這個方法總共有四種形式,目的都是把xml表述的layout轉化為View。
This class is used to instantiate layout XML file into its corresponding View objects . It is never be used directly -- use getLayoutInflater() or getSystemService(String)getLayoutInflater() or getSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on
1. Context.public abstract Object getSystemService (String name) :Return the handle to a system-level service by name. The class of the returned object varies by the requested name. 具體參見文檔。
2. 2種獲得LayoutInflater的方法
(1)通過SystemService獲得LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); (2)從給定的context中獲取
(3)二者區別:實質是一樣的,請看源碼
雖然 Layout也是View的子類,但在android中如果想將xml中的Layout轉換為View放入.java代碼中操作,只能通過 Inflater,而不能通過findViewById(),這一段描述有誤,看如下代碼。看下面文檔寫的已經很清楚。
4. findViewById有2中形式R.layout.xx 是引用res/layout/xx.xml的佈局文件(inflate方法),R.id.xx是引用佈局文件裡面的組件,組件的id是xx. ..(findViewById方法)。看看R.java配置文件吧,R對文件分類管理,多寫幾個layout.xml後你會發現,所有的組件id都能用 R.id.xx來查看,但是組件不在setContentView()裡面的layout中就無法使用,Activity.findViewById() 會出現NullPointException。
(1)Activity中的findViewById()
(2)View中的findViewById()
以上轉載至醋溜的部落格
inflate這個方法總共有四種形式,目的都是把xml表述的layout轉化為View。其中只有一個我個人比較常用,View inflate(int resource, ViewGroup root),另外三個,其實目的和這個差不多。這裡簡單說一下它的用法,相信已經開始實踐的人都差不多用過了。
int resource,也就是resource/layout文件在R文件中對應的ID,這個必須指定。而ViewGroup root則可以是null,null時就只創建一個resource對應的View,不是null時,會將創建的view自動加為root的child。
問題就是為什麼要調用inflate(),而不是用setContentView()讓它自己去inflate?
setContentView()一旦調用, layout就會立刻被貼上UI。而inflate只會把Layout形成一個以view類實現成的對象。到時若有需要時再用 setContentView(view)把它貼上。
以上內容轉載至eoeAndroid論壇
==========================================
一般來講,我們用LayoutInflater做一件事:inflate。 inflate這個方法總共有四種形式,目的都是把xml表述的layout轉化為View。
This class is used to instantiate layout XML file into its corresponding View objects . It is never be used directly -- use getLayoutInflater() or getSystemService(String)getLayoutInflater() or getSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on
1. Context.public abstract Object getSystemService (String name) :Return the handle to a system-level service by name. The class of the returned object varies by the requested name. 具體參見文檔。
2. 2種獲得LayoutInflater的方法
(1)通過SystemService獲得LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); (2)從給定的context中獲取
(3)二者區別:實質是一樣的,請看源碼
- public static LayoutInflater from(Context context) {
- LayoutInflater LayoutInflater =
- (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- if (LayoutInflater == null) {
- throw new AssertionError("LayoutInflater not found.");
- }
- return LayoutInflater;
- }
雖然 Layout也是View的子類,但在android中如果想將xml中的Layout轉換為View放入.java代碼中操作,只能通過 Inflater,而不能通過findViewById(),這一段描述有誤,看如下代碼。看下面文檔寫的已經很清楚。
- <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <LinearLayout android:id="@+id/placeslist_linearlayout"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- LinearLayout>
- >
4. findViewById有2中形式R.layout.xx 是引用res/layout/xx.xml的佈局文件(inflate方法),R.id.xx是引用佈局文件裡面的組件,組件的id是xx. ..(findViewById方法)。看看R.java配置文件吧,R對文件分類管理,多寫幾個layout.xml後你會發現,所有的組件id都能用 R.id.xx來查看,但是組件不在setContentView()裡面的layout中就無法使用,Activity.findViewById() 會出現NullPointException。
(1)Activity中的findViewById()
(2)View中的findViewById()
以上轉載至醋溜的部落格
Friday, June 25, 2010
Tuesday, June 22, 2010
Android的雜七雜八
1.mp.getCurrentPosition()事件最好不要在程式一開始就啟動(建議有按鈕或時間軸的觸發事件)→可能出現IlleagalArgumentException
2. mp.getCurrentPosition()因為回傳millisecond,數值太微小,很難跟動態歌詞的時間對到。
3.TextView.setVisibiliy()、TextView.setBackgroundColor()這種之類的method都要在onCreat()時就設定好,否則出錯
2. mp.getCurrentPosition()因為回傳millisecond,數值太微小,很難跟動態歌詞的時間對到。
3.TextView.setVisibiliy()、TextView.setBackgroundColor()這種之類的method都要在onCreat()時就設定好,否則出錯
Sunday, June 20, 2010
Saturday, June 19, 2010
幽靈程式
我還在開發的mp3播放程式,昨天去請老師幫忙找bug,遇到了一段相當奇怪的狀況
我要將歌詞從txt檔,用BufferedReader.readLine()將資料放進hashMap裡,
我使用String.indexof("a")==1做判斷式,如果第1位是a,那我就不要將這一行放入hashMap。
這個動態歌詞的txt檔一部份是這樣的
我的目的只要將"[00:11.62]繁華聲 遁入空門 折煞了世人"這類型的完整歌詞放進hashMap,
怎麼說"a"都應該在第1位元吧,
但怪異的是Eclipse一直跳出判斷式,
可是相同的程式碼在Netbeans去執行卻沒問題。
老師幫我抓出String.indexof("a")的位置居然是==2,
在[ar:周杰倫]的"[a"前面,居然隱藏了一個空字元!
更怪的來了,當我真的將[a改成==2後,進入判斷式,判斷式裡面使用一個switch去抓出每行歌詞的資料,
我一樣用String.indexof("[")
但是這時候"["又變成==0!
在一旁跟我一起開發mp3的同學,稱此所謂幽靈程式。
老兄,七月還沒到哩!
我要將歌詞從txt檔,用BufferedReader.readLine()將資料放進hashMap裡,
我使用String.indexof("a")==1做判斷式,如果第1位是a,那我就不要將這一行放入hashMap。
這個動態歌詞的txt檔一部份是這樣的
[ti:煙花易冷]
[ar:周杰倫]
[al:跨時代]
[by:253057646]
[ar:周杰倫]
[al:跨時代]
[by:253057646]
[00:11.62]繁華聲 遁入空門 折煞了世人
[00:17.59]夢偏冷 輾轉一生 情債又幾本
[00:17.59]夢偏冷 輾轉一生 情債又幾本
我的目的只要將"[00:11.62]繁華聲 遁入空門 折煞了世人"這類型的完整歌詞放進hashMap,
怎麼說"a"都應該在第1位元吧,
但怪異的是Eclipse一直跳出判斷式,
可是相同的程式碼在Netbeans去執行卻沒問題。
老師幫我抓出String.indexof("a")的位置居然是==2,
在[ar:周杰倫]的"[a"前面,居然隱藏了一個空字元!
更怪的來了,當我真的將[a改成==2後,進入判斷式,判斷式裡面使用一個switch去抓出每行歌詞的資料,
我一樣用String.indexof("[")
但是這時候"["又變成==0!
在一旁跟我一起開發mp3的同學,稱此所謂幽靈程式。
老兄,七月還沒到哩!
Looper和Handler,有如劉備需孔明,孔明也需劉備
之前一直在當柯南,試圖查明Message和Looper、Handler的這段三角關係,什麼時候要用Message,什麼時候還要再多加Looper,Handler又是要幹嘛的?後來看了高煥堂先生第3本著作:物件導向技術與執行緒模式(第三版),才終於知道Looper和Message是連體嬰的關係,
只有不斷的Looper,副執行緒才能不斷的丟出Message,
若沒有Looper,就只會丟僅一次的Message。
而且,Looper的相關功能通常都放在Thread的run()方法中,如下:
public subThread implements Runnalbe{
public void run(){
Looper.prepare();
//程式區塊(譬如像在這裡寫handler.sendMessage(Message);指令)
Looper.loop();
}
這兩行method很關鍵,要重複丟出Message,程式碼就要被包含在這2個method當中。
註:如果啟動了Looper,當run()結束時,Thread也不會dead
只有不斷的Looper,副執行緒才能不斷的丟出Message,
若沒有Looper,就只會丟僅一次的Message。
而且,Looper的相關功能通常都放在Thread的run()方法中,如下:
public subThread implements Runnalbe{
public void run(){
Looper.prepare();
//程式區塊(譬如像在這裡寫handler.sendMessage(Message);指令)
Looper.loop();
}
這兩行method很關鍵,要重複丟出Message,程式碼就要被包含在這2個method當中。
註:如果啟動了Looper,當run()結束時,Thread也不會dead