發表文章
目前顯示的是 2月, 2019的文章
Android 影像記憶體管理心得
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
Android App很容易發生記憶體過量的問題,這個時候如何釋放不用的記憶體成為一門學問,但這篇心得不會講到如何釋放記憶體。 App在讀取大量圖片的情況很容易造成記憶體過量的問題,實際測試在新專案裡面,在xml設定一個ImageView,設定一張原圖大約為300kb的png的圖,居然吃掉了約10mb的記憶體空間,由於Android在讀取的時候是用Bitmap來讀圖,檔案大小會根據原圖的解析度。 所以一個頁面若是有很多圖片,開開關關就很容易造成記憶體過量。在xml定義縮圖也是沒有意義的,只會縮放大小。 (ps:兩個ImageView使用一樣的圖,並不會造成記憶體兩倍。) 這邊提供一個小心得是,在定義xml的時候,都使用同一張圖來定義ImageView,當作是預覽用,讓他佔一個空間以調整大小與距離。 之後在程式執行的時候,首先將圖全部以bitmap的方式讀進來,在一個個view設定圖片,這樣就能夠對bitmap進行真正意義的縮放,還有記憶體的釋放也容易。
android app之間使用socket做溝通
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
最近在製作一個兩個app之間能夠互相溝通並且傳遞一些指令的專案,這種專案適合用socket而不是URLconnection,原因如下。 A socket can implement almost a duplex kind of functionality, whereas a url connection can connect to a given URI and read its content. 經過一些研究之後了解到,要建立一個 Socket 連線,我們必須寫兩支程式,分別代表 Client 端以及 Server 端。在網路上搜尋到一個多人聊天室的範例程式,如下: Server(Server可以在能夠執行java的環境下直接執行) 1 2 client(android studio) 1 2 3 這邊值得一提的是,開Socket Server的主機ip要如何獲得,port可以隨意指定,但是ip要如何獲得呢?這邊提供一個方式 1 new Thread( new Runnable() { @Override public void run () { ChatServer server = new ChatServer() ; server.setContext(MainActivity. this ) ; server.start() ; } }).start() ; 搭配Server.java在MainAvticity加上上面這段,可以印出IP。順帶一提的是,使用Android Studio的模擬器的話,模擬器server的IP為10.0.2.15。兩台模擬器之間要互相連線的話可以參照其他網路上設定虛擬IP的方法。 在別得class創建一個新的activity 最後提一下小心得,Socket的應用於app的小心得,由於創建clinet thread的activity跟發送資料與收到資料時的activity通常不會一樣,我們必須要所有的activity收到資料都要能夠透過那個資料,做一些處理UI的事情,例如創建新的activ...
AsyncTask - 非同步任務
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
AsyncTask是一個相當好用的類別,是專門用來處理背景任務與更新UI的class。 Android 4.0 之後,網路溝通行為都不能在主執行緒(Main Thread)執行, 主執行緒又稱UI執行緒(UI Thread),任何有關UI的東西都在主執行緒中執行,若是你的程式佔據主執行緒很久,使用者體驗會非常的差, 5秒沒有反應的話也會造成程式崩潰,也就是ANR(Application Not Responding)問題,也就是應用程式沒有回應。 Log.d("onClick = " , String.valueOf(Thread.currentThread().getId()));使用這個可以印出行續的編號,若為1則為主執行續,也就是能夠更新ui的執行續。 一般要做複雜的計算並且更新UI的時候,通程會使用Thread搭配Handler一起使用 例如這樣: 不更新ui的時候可以直接使用創建thread: 需要更新ui的時候可以使用runOnUiThread,或是將runOnUiThread塞進其他thread裡面: 建立新的執行續會使用大量資源, 若是在處理一個必須頻繁的更新UI並且不斷的建立新執行續的一個任務,例如:相簿畫廊下載圖片等等,為了要方便管理我們的任務,我們可以使用AsyncTask這個class來管理thread創建的任務。 AsyncTask有四個主要步驟 若是我們需要利用AsyncTask創建的執行續建立新的view,例如下載一張圖後就新增一個ImageView並把它顯示出來的話,可以利用這樣的方式: 關鍵在於使用在MainActivity把Content傳入AsyncTask這個class讓他知道新的view要建立在哪裡。 簡單下載json資料範例