2012年12月18日

java處理小數點

整理網路上找到的相關資訊



double x = 13.52645 ;
double y = 49.99999 ;
無條件捨去到小數點以下1位   (int)(Math.floor(x*10))/10.0 );
無條件捨去到小數點以下2位   (int)(Math.floor(y*100))/100.0 );
無條件捨去到小數點以下3位   (int)(Math.floor(y*1000))/1000.0 );

四捨五入到小數點以下1位   (int)(Math.round(x*10.0))/10.0 );
四捨五入到小數點以下2位   (int)(Math.round(x*100.0))/100.0);
四捨五入到小數點以下3位   (int)(Math.round(x*1000.0))/1000.0 );



Math.round()方法取小數位數:
比如說3.14159要精確到.001位,則先3.14159/.001,然後再Math.round(3.14159/.001),最後在把結果乘以需要精確的位數Math.round(3.14159/.001)*.001

trace(Math.round(3.14159/.001)*.001); //輸出3.142
trace(Math.round(3.14159/.01)*.01); //輸出3.14

如果不想四捨五入,那直接改round()方法為floor()或者ceil()方法即可

toFixed()方法取小數位數:
直接指定toFixed()中的參數即可,比如要留兩位小數,則toFixed(2)

var temp:Number=3.1415926
trace(temp.toFixed(1)); //輸出3.1
temp=18.888;
trace(temp.toFixed(2)); //輸出18.89

Andorid WebView 開啟新瀏覽器問題

在 WebView 中,用戶無論點選了什麼連結,都會開啟新的瀏覽器,
如果你想要在自己的 WebView 中跳轉頁面,就必須建立一個 WebViewClient

假設使用的WebView名稱為myWeb
在oncreate時加入下面的程式碼
myWeb.setWebViewClient(new WebViewClientImpl());


如此在webview上點選連結時,就不會開啟新的瀏覽器了


可參考:WebView 與 WebViewClient


在SDK .90 beta版後,需加入權限才可使用webview
在manifest下加入

<uses-permission android:name="android.permission.INTERNET" />

2012年12月11日

在android layout加入外框

一般網路search到的資訊都是教人使用table layout
但是我們也可以使用shape的方式
在指定的元件下加入外框


首先先在drawable的資料夾下建立myborder的xml檔
程式碼如下

myborder.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#00000000"/>
<stroke android:width="1dp" android:color="#808080"/>
<padding android:left="1dp" android:top="1dp" android:right="1dp" android:bottom="1dp" />
</shape>

然後在你所要加入外框的元件
backgroound設定為myborder外框效果即可顯示
android:background="@drawable/myborder"

2012年11月27日

socket連結問題

當網路速度不夠快時

若傳送方將資料傳送過後直接關闢socket   close()

則會導致接收方,在還沒接收的時候,就偵測到socket關閉

而會有exception產生

所以在資料傳送完成後,只需要使用 flush()

判斷JAVA Socket斷線方法

使用isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等方法,只能得知本地段是否有主動斷線,若server端發稱異常斷線,則這些方法還是會回傳true。

上網查詢,只到了有人分享了一個方法

sendUrgentData,查看文檔後得知它會往輸出流發送一個字節的數據,只要對方Socket的SO_OOBINLINE屬性沒有打開,就會自動舍棄這個字節,而SO_OOBINLINE屬性默認情況下就是關閉的

下面一段代碼就可以判斷遠端是否斷開了連接: 

try{
      socket.sendUrgentData(0xFF);
}catch(Exception ex){
      reconnect();
}
參考連結

2012年10月23日

Android 3.0 發生 android.os.NetworkOnMainThreadException


在作socket連線時,出現了這個錯誤訊息

網路上找到的資料解釋為
是Android 3.0以上在網路的存取上增強的限制。
所以必須要onCreate()中加入底下的程式碼
測試過後即可解決問題
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()     
        .detectDiskReads()     
        .detectDiskWrites()     
        .detectNetwork()   // or .detectAll() for all detectable problems     
        .penaltyLog()     
        .build());     
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()     
        .detectLeakedSqlLiteObjects()     
        .detectLeakedClosableObjects()     
        .penaltyLog()     
        .penaltyDeath()     
        .build());