解決辦法
When you are coding in Eclipse, press CTRL and click on any core Java class name in your source. Eclipse will now show a screen saying you don't have the sources installed. However, in this screen there is a link saying "Attach source...". Click that link and import the src.zip file from your JDK installation directory (src.zip). This should do the trick
Wednesday, June 16, 2010
Tuesday, June 15, 2010
Sunday, June 13, 2010
Friday, June 11, 2010
android裡的thread的朋友:Handler
android裡的thread
好像不能即時Toast和TextView.setText()
一直出現錯誤訊息(後來找到原因,你往下看就知道了)
只能跟在run()裡執行seekbar.setProgress()
很怪,若要用thread傳送即時訊息更新,好像要用到android的class:handler(花了一天得結果:這個推論沒有錯!但是更新和加總的動作不是副執行緒做,副執行緒只負責sleep(1000),副執行緒永遠不可能可以傳送資料去給主畫面)
Android為了考量安全性和執行效能,不允許副執行緒直接更改主畫面的資料
eoeAndroid網友ardwing在評論中提到:
Android的用戶界面更新不是一個執行緒安全的進程。但有多危險我也不清楚,就是知道不能在子執行緒上進行更新。也就是說一切更新必須黏在和OnCreate()一起的主執行緒上。但對於多工工作來說,特別是開發遊戲引擎上是一個障礙。 為了解決這問題,Android提供了一個處理程序和sendMessage的機制。使設計者可以把主執行緒看成一個用戶界面更新的大本營。而每個子執行緒則變成一個獨立運作、獨立判斷的小個體。這些小個體遇到一些用戶界面更新的需要,便透過 sendMessage向大本營發出更新要求,讓大本營,也就是主執行緒進行排期更新。而在主執行緒負責接收這些信息的地方就是處理器下跟帶(?)的程序。
高煥堂老師在他的教學網站說:
以下是我寫的mp3播放程式中,想要即時更新已播放時間,
最後找到的辦法:
副執行緒負責每隔一秒傳message,好讓我主畫面去s=s+1
主執行緒:
1.需新增一個Handler
2.此類別需實作handleMessage()方法
protected void onCreate(Bundle savedInstanceState) {
hr = new Handler(){
public void handleMessage(Message msg) {
switch(msg.what){
//檢查msg.what若為ABC,就執行s+1,
//並將值設成已播放時間
case ABC:
if(mp.isPlaying()==true){
s++;
tv2.setText(convert());
}
break;
}
super.handleMessage(msg);
}
};
}
在跑迴圈的副執行緒:
1.new一個Message類別
2.裡面使用.what函式
3.執行Handler這個物件的sendMessage()方法,括弧裡夾雜Message物件變數
new Thread(new Runnable(){
public void run(){
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//使用Handler和Message把資料丟給主UI去後續處理
if(Playist.this.isFinishing()==true){
return;
}
Message m = new Message();
m.what = ABC;
Playist.this.hr.sendMessage(m);
}
}
}).start();
幾個原則:
1.副執行緒永遠不可能改變主畫面的內容,如:setText主畫面的TextView
2.副執行緒的功能只是做"時間管理",任何計算或迴圈還是得交回主執行緒去處理
好像不能即時Toast和TextView.setText()
一直出現錯誤訊息(後來找到原因,你往下看就知道了)
只能跟在run()裡執行seekbar.setProgress()
很怪,若要用thread傳送即時訊息更新,好像要用到android的class:handler(花了一天得結果:這個推論沒有錯!但是更新和加總的動作不是副執行緒做,副執行緒只負責sleep(1000),副執行緒永遠不可能可以傳送資料去給主畫面)
Android為了考量安全性和執行效能,不允許副執行緒直接更改主畫面的資料
eoeAndroid網友ardwing在評論中提到:
Android的用戶界面更新不是一個執行緒安全的進程。但有多危險我也不清楚,就是知道不能在子執行緒上進行更新。也就是說一切更新必須黏在和OnCreate()一起的主執行緒上。但對於多工工作來說,特別是開發遊戲引擎上是一個障礙。 為了解決這問題,Android提供了一個處理程序和sendMessage的機制。使設計者可以把主執行緒看成一個用戶界面更新的大本營。而每個子執行緒則變成一個獨立運作、獨立判斷的小個體。這些小個體遇到一些用戶界面更新的需要,便透過 sendMessage向大本營發出更新要求,讓大本營,也就是主執行緒進行排期更新。而在主執行緒負責接收這些信息的地方就是處理器下跟帶(?)的程序。
高煥堂老師在他的教學網站說:
在每一個進程有一個主線程(Main Thread),它的主要任務是處理與UI有關的事件(Event),所以又常稱為UI線程。主線程可以誕生子線程(Child Thread),而且「經 常」需要誕生子線程。其主要原因是:主線程(即UI線程)必須時時刻刻(標準為5秒內)去照顧UI的事件,以便快速回應使用者的要求。因此,UI線程沒空閒去執行較為費時的函數(或工作),只好誕生子線程去 執行較為費時的工作了。在Android平台裡,UI線程與其子線程之分工是很明確的:
l 子線程負責執行費時的工作。
l 主線程負責UI的操作或事件;子線程不可以插手有關UI的事。
以下是我寫的mp3播放程式中,想要即時更新已播放時間,
最後找到的辦法:
副執行緒負責每隔一秒傳message,好讓我主畫面去s=s+1
主執行緒:
1.需新增一個Handler
2.此類別需實作handleMessage()方法
protected void onCreate(Bundle savedInstanceState) {
hr = new Handler(){
public void handleMessage(Message msg) {
switch(msg.what){
//檢查msg.what若為ABC,就執行s+1,
//並將值設成已播放時間
case ABC:
if(mp.isPlaying()==true){
s++;
tv2.setText(convert());
}
break;
}
super.handleMessage(msg);
}
};
}
在跑迴圈的副執行緒:
1.new一個Message類別
2.裡面使用.what函式
3.執行Handler這個物件的sendMessage()方法,括弧裡夾雜Message物件變數
new Thread(new Runnable(){
public void run(){
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//使用Handler和Message把資料丟給主UI去後續處理
if(Playist.this.isFinishing()==true){
return;
}
Message m = new Message();
m.what = ABC;
Playist.this.hr.sendMessage(m);
}
}
}).start();
幾個原則:
1.副執行緒永遠不可能改變主畫面的內容,如:setText主畫面的TextView
2.副執行緒的功能只是做"時間管理",任何計算或迴圈還是得交回主執行緒去處理
標籤:
Android
anim.xml動畫資源檔
res\anim\anim.xml讓程式的文字字串、文字顯示方塊、文字按鈕...具被動畫功能
步驟:
1.使用標籤設定動畫
2.再使用
(1):設定透明度
(2):設定尺寸縮放
(3):設定變形
(4):設定旋轉
步驟:
1.使用
2.再使用
(1)
(2)
(3)
(4)
標籤:
Android
Thursday, June 10, 2010
Eclipse裡Android的目錄架構
每一個檔案都有它獨特的意義:
res\ 放置所有資源檔
res\drawable 放置圖檔
res\layout 定義視窗佈局
res\values 定義文字顯示字串
res\anim\anim.xml 放置動畫定義檔
arrays.xml 定義文字資料陣列
colors.xml 定義繪圖或文字字串顏色
dimens.xml 定義顯示文字的尺寸
標籤:
Android
Eclipse的快速鍵
指令 | 功能 | 備註 |
[Alt]+[/] | 自動補齊函式 | sysout+[Alt]+[/]=System.out.println() |
[Ctrl]+[/] | 將程式碼變成註解 | |
[Ctrl]+[Shift]+[O] | 自動加入類別名稱 | |
[Ctrl]+[1] | 函數或變數自動更正 | |
[Ctrl]+[Z] | 回復上一動 | |
[Ctrl]+[O] | 顯示繼承結構 | |
[Alt]+[?] | 參數提示 | [Ctrl]+[Shift]+[Space]也可以 |
[Alt]+[Shift]+[S] | 呼叫程式碼常用編輯選單 |
標籤:
Android
Tuesday, June 8, 2010
Monday, June 7, 2010
讓模擬器模擬出SD卡
讓Android模擬器模擬出sd卡
二種方式,
1.在eclipse裡設定模擬
2.在command裡模擬
1. 在eclipse裡設定模擬
在 Windows / Android SDK and AVD Manager
按「New...」來新增一個 sdcard 映像檔
在 Run / Run Configurations 中
在模擬器中
Settings / SD card & phone storage settings
要先按一下 Mount SD card 把記憶卡映像檔掛進來
然後還要 Format SD card 才能使用此記憶卡
Format 完就會顯示記憶卡容量:512MB
●複製檔案進虛擬sd卡
2.在command裡模擬
(1)創建512M的sd卡
在d:\android\android_sdk\tools\底下執行指令:
mksdcard sdcard 512M d:/android/sdcard.img
這樣在d:/android/裡就會有sdcard.img
(2)在eclipse裡做設定
提外話:
我通常喜歡在windows xp[系統]→[環境變數]裡,
在Path後面新增「;D:\Android\android-sdk-windows\tools」
然後重開機,這樣的話我在命令提示字元下就可以無憂無慮的使用接下來要用的pdb、emulator等在tools底下才有的功能
回歸正傳:
在[run as]→[run configurations]→[target(tag)]→視窗往上拉長→在additional emulator command line options裡打上:
-sdcard d:\android\sdcard.img
●複製檔案進SD卡
在command line
D:\android\android-sdk-windows\tools\底下
打上adb push c:\1.mp3 /sdcard/1.mp3
其中c:\1.mp3是欲複製之路徑名稱在c槽的1.mp3檔案
/sdcard /1.mp3是指要複製進sdcard目錄裡,檔名取為1.mp3,注意要反斜線
註1:若有照之前先在環境變數設Path,就不用在D:\android\android-sdk-windows\tools\底下才能使用adb指令,而可以任選你要的目錄執行adb
註2:使用以上兩種複製檔案的方法,前提都要先將載入SD卡的模擬器開起來
二種方式,
1.在eclipse裡設定模擬
2.在command裡模擬
1. 在eclipse裡設定模擬
在 Windows / Android SDK and AVD Manager
按「New...」來新增一個 sdcard 映像檔
在 Run / Run Configurations 中
在模擬器中
Settings / SD card & phone storage settings
要先按一下 Mount SD card 把記憶卡映像檔掛進來
然後還要 Format SD card 才能使用此記憶卡
Format 完就會顯示記憶卡容量:512MB
●複製檔案進虛擬sd卡
2.在command裡模擬
(1)創建512M的sd卡
在d:\android\android_sdk\tools\底下執行指令:
mksdcard sdcard 512M d:/android/sdcard.img
這樣在d:/android/裡就會有sdcard.img
(2)在eclipse裡做設定
提外話:
我通常喜歡在windows xp[系統]→[環境變數]裡,
在Path後面新增「;D:\Android\android-sdk-windows\tools」
然後重開機,這樣的話我在命令提示字元下就可以無憂無慮的使用接下來要用的pdb、emulator等在tools底下才有的功能
回歸正傳:
在[run as]→[run configurations]→[target(tag)]→視窗往上拉長→在additional emulator command line options裡打上:
-sdcard d:\android\sdcard.img
●複製檔案進SD卡
在command line
D:\android\android-sdk-windows\tools\底下
打上adb push c:\1.mp3 /sdcard/1.mp3
其中c:\1.mp3是欲複製之路徑名稱在c槽的1.mp3檔案
/sdcard /1.mp3是指要複製進sdcard目錄裡,檔名取為1.mp3,注意要反斜線
註1:若有照之前先在環境變數設Path,就不用在D:\android\android-sdk-windows\tools\底下才能使用adb指令,而可以任選你要的目錄執行adb
註2:使用以上兩種複製檔案的方法,前提都要先將載入SD卡的模擬器開起來
標籤:
Android
Sunday, June 6, 2010
安裝 Android source code至Eclipse
撰寫時間︰2010/06/06 18:51
更新時間︰2012/06/14 1000
文章更新次數︰2
因為Android現在都有將Source Code直接放在Android SDK Manager裡供我們下載,所以之前的安裝方式都不需要再理會了。
除非你想追Android4.0以前的source code。
安裝Android 4.0 source code方式如下︰
1.首先,從Android SDK Manager下載Source code。
![]() |
下載Android Source code |
2.然後,在你的專案程式碼中,選擇任何一個Android的物件(如︰Activity),按下Ctrl+滑鼠左鍵(這個動作是告訴電腦你想要看Android的Class: Activity 的Source Code)
3.此時,你的Eclipse告訴你它找不到Activity類別的Source code
![]() |
我找不到Activity的Source code |
5.選擇你Android SDK的安裝目錄
6.按下確定,Eclipse就會幫你把Android Source Code匯入。
註︰匯入時間蠻久的,你會以為你的Eclipse當掉了。
7.完成後,就可以看到Android 4.0.3的Activity Source Code了。
![]() |
Android class: Activity的Source code |
Enjoy it!
=============================
話說: 我們都會想要在程式碼中,直接按Ctrl直接看原始碼 但是Android source卻發生沒安裝的狀況。 解決辦法: 1.安裝msysGit 2.下載Full Installer版本 3.安裝完後,在出現的畫面打上: $git clone git://android.git.kernel.org/platform/frameworks/base.git 4.下載完後,會看到下載的檔案被放到C:\msysgit\base裡
(1)首先,我必須先在android_sdk的安裝目錄:android-sdk-windows\platforms\android-8\底下,先創建一個\sources資料夾。
(2)要將C:\msysgit\base\core\java\android這個目錄,複製到我android_sdk的安裝目錄:android-sdk-windows\platforms\android-8\sources\底下
在Eclipse裡安裝Tomcat
1.先將eclipse關閉
2.解壓縮TomcatV6放在想放的位置
3.將tomcatPluginV321.zip解壓縮至eclipse\plugin\目錄底下
6.仍然在[Preferences]視窗,選擇[Tomcat]→Tomcat version選擇Version 6.x,
7.最後按上ok,應該可以在eclipse裡方便啟用Tomcat了
標籤:
Android
Saturday, June 5, 2010
Android和伺服器的親密關係
Android和Internet的連線,
整合了Apache 4模組,
也因此,要寫出和http協定相關程式並非難事。
HttpPost和HttpGet都會發出"伺服器請求",跟伺服器要資料
●HttpPost類別發出伺服器請求的步驟:
1.先建立HttpPost實體
HttpPost a = new HttpPost();
這個類別,能夠以三種建構子建立:
(1)new HttpPost();
(2)new HttpPost(URI uri);
(3)new HttpPost(String uri);
我在這裡用第3種
HttpPost hr = new HttpPost("http://localhost:8080/request.txt");
2.使用HttpPost.setEntity()發出伺服器請求
HttpEnitity原來是介面,
也就是說如果要使用這個method,
我們必須有一個HttpEnitity底下的實作類別的實體產生,
而這個實作類別,我們使用new UrlEncodedFormEntity。
(2)UrlEncodedFormEntity這個類別的建構子,API裡寫到有2種建構子可以使用:
(3)要命喔,當我們開始要用NameValuePair時,才發現這個NameValuePair又是介面!
→也就是說,若我們要add List時,
我們被規定了,只能add(new BasicNameValuePair());
(4)BasicNameValuePair這個類別的建構子是這樣的:
當我們在new這個類別時,放入的name和value,
就是我們要丟出的伺服器請求訊息了。
3.當我們將setEntity()這個method的內容都產生出實體了,
自然就可以直接用HttpPost.setEntity()送出實體封包給伺服器了。
●使用HttpResponse實體來接收伺服器的回應
1.先建立HttpResponse實體
使用new DefaultHttpClient().execute(httpPost的變數名稱)去接收伺服器回應
HttpResponse hr = new DefaultHttpClient().excute(hp);
2.判斷伺服器狀態,若為ok,才執行我們要做的指令
if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK ){
//程式碼區塊
}
上面的判斷式 HttpStatus.SC_OK可以改成 ==200
3.確認伺服器有給出回應了,我們才來處理接收到的封包
所以程式碼區塊裡的資料可能如下:
String s = EntityUtils.toString(hp.getEntity());
最後再看我們要將s怎麼做處理。
看是要顯示出來,還是$^%
標籤:
Android
Subscribe to:
Posts (Atom)