編輯:關於Android編程
公司在做一個項目 要求記錄用戶行為,寫行為日志文件到SD卡。實現思想 不影響界面用戶體驗,要時時記錄日志 不能漏掉。
1.並發處理日志 寫一個類負責管理各個線程傳過來的日志數據,日志數據放在隊列中等待寫線程去處理。這裡每次添加一條日志數據都會檢查寫日志線程是否在工作,同時為了並發處理傳過來的數據采用synchronized 同步:
ConcurrentLinkedQueue 是基於鏈接節點的、線程安全的隊列。並發訪問不需要同步。因為它在隊列的尾部添加元素並從頭部刪除它們,所以只要不需要知道隊列的大小, ConcurrentLinkedQueue 對公共集合的共享訪問就可以工作得很好。收集關於隊列大小的信息會很慢,需要遍歷隊列 建議使用 if(!queue.isEmpty()) 判斷是否空
package com.xx.log; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.concurrent.ConcurrentLinkedQueue; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggerFactory; import android.util.Log; /** * 行為日志記錄 * @author Administrator * */ public class ActionLog { protected final static Logger logger = Logger.getLogger(ActionLog.class); public static String filePath=""; public static ConcurrentLinkedQueue tempQueue=new ConcurrentLinkedQueue
2.異步寫數據到文件 不影響用戶體驗,不能因為寫日志而有任何延遲.(實驗中如果一次寫入文件中的數據比較小,即使同步寫入也不會太慢)為了達到這一目的首先考慮多線程另起一個線程專門負責來寫日志到文件中代碼如下:
package com.xx.log; import com.google.gson.Gson; public class WriteThread extends Thread{ public static boolean isWriteThreadLive=false;//寫日志線程是否已經在運行了 public WriteThread() { isWriteThreadLive=true; } @Override public void run() { isWriteThreadLive=true; Gson gson=new Gson(); while(!ActionLog.tempQueue.isEmpty()){//對列不空時 try { //寫日志到SD卡 ActionLog.recordStringLog(gson.toJson(ActionLog.tempQueue.poll())); } catch (Exception e) { e.printStackTrace(); } } isWriteThreadLive=false;//隊列中的日志都寫完了,關閉線程(也可以常開 要測試下) } }
其實我覺得 寫線程還是要一直保持運行可能更好,頻繁的創建線程對象應該也很耗費性能
好了以上代碼經過測試 可以達到多個線程大量並發寫日志,可以保證按順序寫入到文件中,而不影響用戶體驗 反應時間用戶感覺上可以忽略不計
由於時間問題 我還要寫上傳日志的處理,寫日志的功能暫時先這樣,以後有時間了研究下保持寫線程一直live 直到整個程序結束。還有進過測試 能提升多少性能是否有這個必要。
Android SDK已經提供有進度條組件ProgressDialog組件,但用的時候我們會發現可能風格與我們應用的整體風格不太搭配,而且ProgressDialog的可
Drawable基礎什麼是Drawable首先Drawable是一個抽象類,表示的是可以在Canvas中繪制的圖像,常被用作一個view的背景,有多種實現類完成不同的功能
本文主要有以下內容:* 自定義View的分類* 自定義View的注意事項* 自定義View的實現* 自定義View使其支持wrap_content和padding* 自定
高斯模糊、加載監聽、圓角圖片這些相信大家都很熟悉,那如何實現這些效果,請大家參考本文進行學習。1、引用compile com.github.bumptech.glide: