项目中常会遇到的工具类 总结留存
首先Activity的抽象类 BaseActivity
/**
* Activity 基類
* @author KrisLight
*
*/
public abstract class BaseActivity extends Activity {
private static final String TAG = BaseActivity.class.getSimpleName();
/**
* 消息類型默認Default
*/
public static int MSGTYPE_DEFAULT = 0;
/**
* 消息類型為Info
*/
public static int MSGTYPE_INFO = 1;
/**
* 消息類型為Warning
*/
public static int MSGTYPE_WARNING = 2;
/**
* 消息類型為Error
*/
public static int MSGTYPE_ERROR = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**初始化**/
protected abstract void init();
/** 初始化監聽器**/
protected abstract void initListener();
/** 得到字符串資源 **/
public String getResStr(int id)
{
return this.getResources().getString(id);
}
/** 短暂显示Toast提示(来自res) **/
protected void showShortToast(int resId) {
Toast.makeText(this, getString(resId), Toast.LENGTH_SHORT).show();
}
/** 短暂显示Toast提示(来自String) **/
protected void showShortToast(String text) {
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
/** 长时间显示Toast提示(来自res) **/
protected void showLongToast(int resId) {
Toast.makeText(this, getString(resId), Toast.LENGTH_LONG).show();
}
/** 长时间显示Toast提示(来自String) **/
protected void showLongToast(String text) {
Toast.makeText(this, text, Toast.LENGTH_LONG).show();
}
/** Debug输出Log日志 **/
protected void showLogDebug(String tag, String msg) {
Log.d(tag, msg);
}
/** Error输出Log日志 **/
protected void showLogError(String tag, String msg) {
Log.e(tag, msg);
}
/** 通过Class跳转界面 **/
protected void startActivity(Class<?> cls) {
startActivity(cls, null);
}
/** 含有Bundle通过Class跳转界面 **/
protected void startActivity(Class<?> cls, Bundle bundle) {
Intent intent = new Intent();
intent.setClass(this, cls);
if (bundle != null) {
intent.putExtras(bundle);
}
if(intent.resolveActivity(getPackageManager()) != null){
startActivity(intent);
}else{
showLogError(TAG, "there is no activity can handle this intent: "+intent.getAction().toString());
}
overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
}
/** 通过Action跳转界面 **/
protected void startActivity(String action) {
Intent intent = new Intent();
intent.setAction(action);
if(intent.resolveActivity(getPackageManager()) != null){
startActivity(intent);
}else{
showLogError(TAG, "there is no activity can handle this intent: "+intent.getAction().toString());
}
}
/**含有Date通过Action跳转界面**/
protected void startActivity(String action,Uri data) {
Intent intent = new Intent();
intent.setAction(action);
intent.setData(data);
if(intent.resolveActivity(getPackageManager()) != null){
startActivity(intent);
}else{
showLogError(TAG, "there is no activity can handle this intent: "+intent.getAction().toString());
}
}
/** 含有Bundle通过Action跳转界面 **/
protected void startActivity(String action, Bundle bundle) {
Intent intent = new Intent();
intent.setAction(action);
if (bundle != null) {
intent.putExtras(bundle);
}
if(intent.resolveActivity(getPackageManager()) != null){
startActivity(intent);
}else{
showLogError(TAG, "there is no activity can handle this intent: "+intent.getAction().toString());
}
overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
}
/** 含有标题、内容、两个按钮的对话框 **/
protected void showAlertDialog(String title, String message,
String positiveText,
DialogInterface.OnClickListener onPositiveClickListener,
String negativeText,
DialogInterface.OnClickListener onNegativeClickListener) {
AlertDialog alertDialog = new AlertDialog.Builder(this).setTitle(title)
.setMessage(message)
.setPositiveButton(positiveText, onPositiveClickListener)
.setNegativeButton(negativeText, onNegativeClickListener).create();
alertDialog.show();
}
/** 含有标题、内容、图标、两个按钮的对话框 **/
protected void showAlertDialog(String title, String message,
int icon, String positiveText,
DialogInterface.OnClickListener onPositiveClickListener,
String negativeText,
DialogInterface.OnClickListener onNegativeClickListener) {
AlertDialog alertDialog = new AlertDialog.Builder(this).setTitle(title)
.setMessage(message).setIcon(icon)
.setPositiveButton(positiveText, onPositiveClickListener)
.setNegativeButton(negativeText, onNegativeClickListener).create();
alertDialog.show();
}
/**
*
* @Function: com.light.mycal.base.BaseActivity
* @Description:根據不同的信息類型彈出不同等級的對話框
*
* @param i 資源id
* @param iMsgType 信息類型
*
* @version:v1.0
* @author:KrisLight
* @date:2013/9/4 下午4:56:39
*
* Modification History:
* Date Author Version Description
* -----------------------------------------------------------------
* 2013/9/4 KrisLight v1.0.0 create
*/
public void ShowMsgResStr(int i, int iMsgType)
{
String sTitle = getResStr(R.string.app_name);
int iconId = 0;
if (iMsgType == MSGTYPE_INFO)
{
sTitle = getResStr(R.string.msgTypeInfo);
iconId = R.drawable.msgicon_info;
}
if (iMsgType == MSGTYPE_WARNING)
{
sTitle = getResStr(R.string.msgTypeWarning);
iconId = R.drawable.msgicon_warning;
}
if (iMsgType == MSGTYPE_ERROR)
{
sTitle = getResStr(R.string.msgTypeError);
iconId = R.drawable.msgicon_error;
}
AlertDialog.Builder dlg = new AlertDialog.Builder(this);
dlg.setMessage(getResStr(i));
dlg.setPositiveButton(getResStr(R.string.msgBoxButtonOk), null);
dlg.setTitle(sTitle);
dlg.setIcon(iconId);
dlg.create();
dlg.show();
}
/** 带有右进右出动画的退出 **/
public void finish() {
super.finish();
overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);
}
/** 默认退出 **/
protected void defaultFinish() {
super.finish();
}
}
public class Prefs {
/** Friend+'s Preference file name */
public static final String PREF_FILE = "friends_plus_pref";
/** Preference key[authToken] */
public static final String KEY_AUTH_TOKEN = "auth_token";
/** Preference key[clientId] */
public static final String KEY_CLIENT_ID = "client_id";
/** Preference key[login_email] */
public static final String KEY_LOGIN_EMAIL = "login_email";
/** Preference key[login_IMId] */
public static final String KEY_LOGIN_IMID = "login_imid";
/** Preference key[login_name] */
public static final String KEY_LOGIN_NAME = "login_name";
/** Preference key[last_update_contact_list] */
public static final String KEY_LAST_UPDATE_CONTACT_LIST = "last_update_contact_list";
public static final String KEY_REGISTRATION_STEP = "registration_step";
public static final String REGISTRATION_STEP_AUTHENTICATE = "authenticate";
public static final String KEY_REGISTRATION_AUTHEN_CODE = "authen_code";
/**
* get the app's preference data
*
* @param context
* @param prefKey preference key
* @return
*/
public static String getPreference(Context context, String prefKey) {
return getPreference(context, prefKey, "");
}
/**
* get the app's preference data
*
* @param context
* @param prefKey preference key
* @param defVal default value
* @return
*/
public static String getPreference(Context context, String prefKey, String defVal) {
if (TextUtils.isEmpty(prefKey))
return null;
SharedPreferences prefs =
context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
return prefs.getString(prefKey, defVal);
}
/**
* write data to app's preference
*
* @param context
* @param prefKey
* @param prefValue
*/
public static void savePreference(Context context, String prefKey, String prefValue) {
if (TextUtils.isEmpty(prefKey))
return;
SharedPreferences.Editor editor =
context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE).edit();
editor.putString(prefKey, prefValue).commit();
}
/**
* remove preference value from app's preference file
* @param context
* @param prefKey
*/
public static void removePreference(Context context, String prefKey){
if (TextUtils.isEmpty(prefKey))
return;
SharedPreferences.Editor editor =
context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE).edit();
editor.remove(prefKey).commit();
}
}
DBHelper类
/**
* DB工具類
* @author KrisLight
*
*/
public class DatabaseOpenHelper extends SQLiteOpenHelper
{
private static final String TAG = DatabaseOpenHelper.class.getSimpleName();
/** 數據庫操作結果 **/
public enum Result
{
/** 成功 **/
Success,
/**未知錯誤**/
errUnknown,
/**無法插入新數據**/
errCantInsertNewData,
/**無法更新數據**/
errCantUpdateData,
/**無法創建Table**/
errCantCreateTable,
/**無法訪問數據庫**/
errNoDbAccess,
/**無法從表中獲取數據**/
errCantGetDataFromTable,
/**無法查到數據**/
errCantFindData,
/**無法得到數據**/
errCantGetData,
/**無法刪除數據**/
errCantDeleteData,
/**表不存在**/
errTableNotExists,
/**不能為該字段指定值**/
errCantSetValuesForDataRow,
/**不能從該字段得到值**/
errCantGetValuesFromDataRow,
};
/** 表名 **/
public static final String TABLE_NAME = "appointments";
/** 臨時表名 **/
public static final String TEMP_TABLE_NAME = "tempDb";
/** 數據庫名 **/
private static final String DB_NAME = "MyCal.db";
private SQLiteDatabase db = null;
/** 版本号 **/
private static final int DB_VERSION = 1;
/**創建Table的結果**/
private Result resultDbTablesCreated = Result.errUnknown;
public DatabaseOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, DB_NAME, factory, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
DataRow nDataRow = new NoteDataRow();
String create_sql = getSqlTableDefinition(nDataRow.GetTableName(), nDataRow.GetTableDef());
Log.d(TAG, "create_sql: ---------------------"+create_sql+ "------------");
try{
sqLiteDatabase.execSQL(create_sql);
resultDbTablesCreated = DatabaseOpenHelper.Result.Success;
}catch (Exception e) {
resultDbTablesCreated = DatabaseOpenHelper.Result.errCantCreateTable;
}
}
/**
* 得到創建表的SQL語句
* @param sTableName 表名
* @param vecTableDef 表的字段數組
* @return
*/
public String getSqlTableDefinition(String sTableName, DataField[] vecTableDef)
{
String def = "CREATE TABLE " + sTableName + " (";
for (int i = 0; i < vecTableDef.length; i++)
{
def += vecTableDef[i].GetColumnDefinition();
if (i < (vecTableDef.length - 1))
//中間逗號分隔
def += ", ";
}
def += ")";
return def;
}
/* (non-Javadoc)
* @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion) {
case 2:
/** only add column on old table**/
// String add_column_sql = getSqlTableAddColumn(TABLE_NAME,newColumn);
// Log.d(TAG, "add_column_sql:--------------"+add_column_sql+"----------");
// db.execSQL(add_column_sql);
// break;
case 3:
//原來的字段集合
List<String> columns = getColumns(db, TABLE_NAME);
String rename_sql = getSqlTableRename(TABLE_NAME);
Log.d(TAG, "rename_sql:--------------"+rename_sql+"----------");
//重命名
db.execSQL(rename_sql);
//創建新表
onCreate(db);
//舊字段和新的字段求交集
columns.retainAll(getColumns(db, TABLE_NAME));
String cols = Utils.join(columns, ",");
//將舊的數據插入到新表
db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TABLE_NAME, cols, cols, TABLE_NAME));
String drop_sql = getSqlTableDrop(TEMP_TABLE_NAME);
Log.d(TAG, "drop_sql:--------------"+drop_sql+"----------");
db.execSQL(drop_sql);
break;
default:
String ds = getSqlTableDrop(TABLE_NAME);
Log.d(TAG, "drop_sql:--------------"+ds+"----------");
break;
}
}
/**
* 得到重命名SQL
*/
private String getSqlTableRename(String tableName){
StringBuffer sb = new StringBuffer();
sb.append("ALTER TABLE ");
sb.append(tableName);
sb.append(" RENAME TO temp_");
sb.append(tableName);
return sb.toString();
}
/**
* 得到刪除表SQL
*/
private String getSqlTableDrop(String tableName){
StringBuffer sb = new StringBuffer();
sb.append("DROP TABLE IF EXISTS ");
sb.append(tableName);
return sb.toString();
}
/**
* 得到新增字段的表SQL
*/
private String getSqlTableAddColumn(String tableName,String columnName){
StringBuffer sb = new StringBuffer();
sb.append("ALTER TABLE ");
sb.append(tableName);
sb.append(" ADD COLUMN ");
sb.append(columnName);
return sb.toString();
}
/**
* 得到這個Table中的所有字段組成的List集合
*/
public static List<String> getColumns(SQLiteDatabase db, String tableName) {
List<String> ar = null;
Cursor c = null;
try {
//查一條數據得到所有字段
c = db.rawQuery("select * from " + tableName + " limit 1", null);
if (c != null) {
ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null)
c.close();
}
return ar;
}
/**
* 得到數據庫的名字
*
*/
public final String getName()
{
return DB_NAME;
}
/** 得到錯誤信息描述 **/
public static int getErrDesc(Result result)
{
int msgId = R.string.errUnknown;
if (result == Result.errCantInsertNewData)
msgId = R.string.errCantInsertNewData;
if (result == Result.errCantUpdateData)
msgId = R.string.errCantUpdateData;
if (result == Result.errCantCreateTable)
msgId = R.string.errCantCreateTable;
if (result == Result.errNoDbAccess)
msgId = R.string.errNoDbAccess;
if (result == Result.errCantGetDataFromTable)
msgId = R.string.errCantGetDataFromTable;
if (result == Result.errCantFindData)
msgId = R.string.errCantFindData;
if (result == Result.errCantGetData)
msgId = R.string.errCantGetData;
if (result == Result.errCantDeleteData)
msgId = R.string.errCantDeleteData;
if (result == Result.errTableNotExists)
msgId = R.string.errTableNotExists;
if (result == Result.errCantSetValuesForDataRow)
msgId = R.string.errCantSetValuesForDataRow;
if (result == Result.errCantGetValuesFromDataRow)
msgId = R.string.errCantGetValuesFromDataRow;
return msgId;
}
/**關閉DB**/
public void close()
{
if (isOpened())
db.close();
}
/**判斷DB是否打開**/
public boolean isOpened()
{
if (db != null)
return true;
return false;
}
/**得到DB寫操作類 **/
public SQLiteDatabase getWriteSQLiteDb()
{
return getWritableDatabase();
}
/**得到DB讀操作類 **/
public SQLiteDatabase getReadSQLiteDb()
{
return getReadableDatabase();
}
/**查詢Table是否存在**/
public boolean isTableExists(String sTableName)
{
boolean bResult = false;
if (isOpened())
{
String sql = "select name from sqlite_master where type = 'table' and name = '%s'";
sql = String.format(sql, sTableName);
Cursor cr = db.rawQuery(sql, null);
if (cr.getCount() > 0)
bResult = true;
cr.close();
}
return bResult;
}
/** 建表是否成功 **/
public boolean TablesCreated()
{
return resultDbTablesCreated == Result.Success;
}
/** 判斷DB是否準備好了**/
public synchronized boolean DatabaseReady()
{
return (isOpened() && TablesCreated());
}
/** 返回創建表的結果 是成功還是失敗 **/
public Result TablesCreationResult()
{
return resultDbTablesCreated;
}
}
表中字段类DataField
/**
* 表中的字段類
* @author KrisLight
*/
public class DataField
{
//types
/** Type枚举 如:INT,TEXT,BOOL**/
public static enum Type { INT, TEXT, BOOL };
//fields
/** Calendar實例 **/
private Calendar dateOut = Calendar.getInstance();
//fields
/** 對應的數據類型 **/
private DataRow dataRow = null;
/** 對應字段的值 **/
private ContentValues values = null;
//fields
/**字段索引**/
private int index = 0;
/** ContentValues存放鍵值對的鍵值 **/
private String sName = "";
/** 字段类型 从Type枚举中取一个类型的值 默認為Int **/
private Type FieldType = Type.INT;
/**是否可以為空**/
private boolean bCanBeNull = true;
/**是否是主鍵**/
private boolean bPrimaryKey = false;
//methods
/**
* 构造方法
* @param index 索引
* @param sName 字段名
* @param FieldType 字段类型
* @param bCanBeNull 是否为空
* @param bPrimaryKey 是否为主键
*/
public DataField(int index, String sName, Type FieldType, boolean bCanBeNull, boolean bPrimaryKey)
{
this.index = index;
this.sName = sName;
this.FieldType = FieldType;
this.bCanBeNull = bCanBeNull;
this.bPrimaryKey = bPrimaryKey;
}
/**
* 得到每一個字段描述 形如: "name int PRIMARY KEY Not Null"
* @return
*/
public String GetColumnDefinition()
{
String s = sName + " " + GetSqlType(FieldType);
if (bPrimaryKey)
s += " PRIMARY KEY";
if (!bCanBeNull)
s += " NOT NULL";
return s;
}
public Type GetType()
{
return FieldType;
}
public int GetIndex()
{
return index;
}
/** 根據SqlType返回真實的類型字段 注意BOOL對應的是Integer 其他類型的用Text **/
public String GetSqlType(Type value)
{
switch (value)
{
case INT: return "INTEGER";
case TEXT: return "TEXT";
case BOOL: return "INTEGER";
}
return "TEXT";
}
/** 设置这个字段对应的数据类型 **/
public void SetParentRow(DataRow dataRow)
{
this.dataRow = dataRow;
this.values = this.dataRow.GetContentValues();
}
/** 得到字段的名字 **/
public String GetName()
{
return sName;
}
//getters
/** 字符串类型的字段的值 **/
public String asString()
{
return values.getAsString(sName);
}
/** Long类型的字段的值 **/
public long asLong()
{
return values.getAsLong(sName);
}
/** Boolean类型的字段的值 **/
public boolean asBoolean()
{
return (values.getAsLong(sName) == 1);
}
/** 判断是否为Null **/
public boolean isNull()
{
return (values.get(sName) == null);
}
/** 将Long类型的日期类型转换成标准的日期时间 **/
public Calendar asCalendar()
{
dateOut.setTimeInMillis(values.getAsLong(sName));
return dateOut;
}
//setters
/** 设置字符串值 **/
public void set(String value)
{
values.put(sName, value);
}
/** 设置整型值 **/
public void set(long value)
{
values.put(sName, value);
}
/** 设置布尔值 **/
public void set(boolean value)
{
int i = (value)?1:0;
values.put(sName, i);
}
/** 设置日期值 **/
public void set(Calendar value)
{
values.put(sName, value.getTimeInMillis());
}
/** 设置Null值 **/
public void setNull()
{
values.put(sName, (String)null);
}
}
数据原型类DataRow
/**
* 抽象的数据类型类,
* 所有的数据原型都要继承这个类
* @author KrisLight
*
*/
public abstract class DataRow
{
/** 这个类型对应表中的字段集合 **/
private DataField[] vecTableDef = null;
/** 这个类型对应表中的字段的值 用ContentValues形式存放 **/
private ContentValues values = new ContentValues();
/** 構造方法 **/
public DataRow(){}
/**
* 設置字段集合并綁定
* @param vecTableDef 字段集合
*/
public void SetTableDefinition(DataField[] vecTableDef)
{
this.vecTableDef = vecTableDef;
UpdateDataFieldsParentRow(this);
}
/** 將數據類型綁定其對應的所有字段 **/
public void UpdateDataFieldsParentRow(DataRow row)
{
for (int i = 0; i < vecTableDef.length; i++)
vecTableDef[i].SetParentRow(row);
}
/** 拷貝另一個DataRow中的所有字段 **/
public void CopyTableDefinition(DataRow data)
{
SetTableDefinition(data.vecTableDef);
}
/** 得到表中的所有字段 **/
public DataField[] GetTableDef()
{
return vecTableDef;
}
/** 驗證方法 **/
public boolean Validate()
{
return false;
}
/** 清空ContentValues **/
public void ClearContentValues()
{
values.clear();
}
/** 得到ContentValues **/
public ContentValues GetContentValues()
{
return values;
}
/** 設置ContentValues **/
public void SetContentValues(ContentValues values)
{
this.values = values;
UpdateDataFieldsParentRow(this);
}
/** 拷貝ContentValues **/
public boolean CopyContentValues(ContentValues values)
{
this.values = values;
UpdateDataFieldsParentRow(this);
try
{
GetValuesFromDataRow();
return true;
} catch (Exception e) {
}
return false;
}
/** 根據索引取出字段 **/
public DataField Value(int idx)
{
return vecTableDef[idx];
}
/** 得到索引位置的字段名 **/
public String fieldName(int idx)
{
return vecTableDef[idx].GetName();
}
/** 查詢結果 遍歷Cursor結果集給對應的字段賦值 **/
public boolean GetValuesFromCursor(Cursor cr)
{
if ((cr != null) && (cr.getPosition() != -1))
{
//遍歷
for (int idx = 0; idx < vecTableDef.length; idx++)
{
DataField field = Value(idx);
//check if null value
if (cr.isNull(idx))
{
//如果查出的值為空 ,設置為空
field.setNull();
} else {
//根據其對應的類型取值
final DataField.Type t = field.GetType();
//parse value by type
if (t == DataField.Type.INT)
field.set(cr.getLong(idx));
if (t == DataField.Type.TEXT)
field.set(cr.getString(idx));
if (t == DataField.Type.BOOL)
field.set((cr.getInt(idx) == 1)?true:false);
}
}
return true;
}
return false;
}
//sets fields values data (ContentValues values contener) from parent object fields
/** 為字段賦值 **/
public abstract void SetValuesForDataRow();
//gets data from fields values (ContentValues values contener) to parent object fields
/** 得到這個數據類型對應的所有的字段的值 **/
public abstract void GetValuesFromDataRow();
/** 得到表名 **/
public abstract String GetTableName();
}
Table类
/**
* 數據庫中的表類 包含了该表对应的数据类型以及对表的增删改查操作方法
* @author KrisLight
*/
public class DataTable
{
/** 這個表綁定的數據類型 **/
private DataRow dataRow = null;
/** DB輔助類 **/
private DatabaseOpenHelper helper;
/**
* 更據DataRow來決定是哪一個Table
* @param dataRow
*/
public DataTable(DataRow dataRow,DatabaseOpenHelper helper)
{
this.dataRow = dataRow;
this.helper = helper;
}
/** 得到表名 **/
public String getTableName()
{
return dataRow.GetTableName();
}
//DataRow getter()
public DataRow getDataRow()
{
return dataRow;
}
/** 基本的插入操作 **/
public long insertValues()
{
long lRowId = helper.getWritableDatabase().insert(getTableName(), null, dataRow.GetContentValues());
return lRowId;
}
/** 基本的根據ID更新操作 **/
public long updateValues(long lRowId)
{
String sWhere = String.format("_ID = %d", lRowId);
long lRowsUpdated = helper.getWritableDatabase().update(getTableName(), dataRow.GetContentValues(), sWhere, null);
return lRowsUpdated;
}
/** 基本的根據ID刪除操作 **/
public long deleteDataRow(long lRowId)
{
String sWhere = String.format("_ID = %d", lRowId);
long lRowsUpdated = helper.getWritableDatabase().delete(getTableName(), sWhere, null);
return lRowsUpdated;
}
/** 基本的根據Id查詢表中的所有字段值 **/
public Cursor locateDataRow(long lRowId)
{
List<String> columnNames = getColumn();
String cols = Utils.join(columnNames, ",");
final String s = "select %s from %s where _ID = %d";
String sql = String.format(s, cols, getTableName(), lRowId);
Cursor cr = helper.getReadableDatabase().rawQuery(sql, null);
//if cursor valid, set first data row as current
if ((cr != null) && (cr.getCount() > 0))
cr.moveToFirst();
return cr;
}
/** 基本的根據類型和REF_ID查詢鬧鈴提醒功能表的所有字段數據 **/
public Cursor locateAlarmDataRow(int iType, long lRefID)
{
List<String> columnNames = getColumn();
String cols = Utils.join(columnNames, ",");
final String s = "select %s from %s where Type = %d and RefID = %d";
String sql = String.format(s, cols, getTableName(), iType, lRefID);
Cursor cr = helper.getReadableDatabase().rawQuery(sql, null);
if ((cr != null) && (cr.getCount() > 0))
cr.moveToFirst();
return cr;
}
/**
* 封装的saveOrUpdate操作
* @param bInsertMode 是否是插入模式 為true的話是插入新的數據 為false則直接更新舊數據
* @param lEditRowId ID
* @return
*/
public DatabaseOpenHelper.Result updateData(boolean bInsertMode, long lEditRowId)
{
DatabaseOpenHelper.Result result = DatabaseOpenHelper.Result.errUnknown;
if (helper.isOpened())
{
try
{
//為字段賦值
dataRow.SetValuesForDataRow();
} catch (Exception e) {
//異常就拋出錯誤信息 不能為數據類型的字段賦值
return DatabaseOpenHelper.Result.errCantSetValuesForDataRow;
}
//select update mode
if (bInsertMode)
{
//insert new data row
long lRowId = insertValues();
if (lRowId > 0)
{
//插入成功
result = DatabaseOpenHelper.Result.Success;
} else {
//插入失敗
result = DatabaseOpenHelper.Result.errCantInsertNewData;
}
} else {
//update existing data row
long lRowsUpdated = updateValues(lEditRowId);
if (lRowsUpdated == 1)
{
//更新成功
result = DatabaseOpenHelper.Result.Success;
} else {
//更新失敗
result = DatabaseOpenHelper.Result.errCantUpdateData;
}
}
} else {
result = DatabaseOpenHelper.Result.errNoDbAccess;
}
return result;
}
/** 封装的根據Id刪除 **/
public DatabaseOpenHelper.Result deleteData(long iRowId)
{
DatabaseOpenHelper.Result result = DatabaseOpenHelper.Result.errUnknown;
if (helper.isOpened())
{
if (helper.isTableExists(getTableName()))
{
long lRowsDeleted = deleteDataRow(iRowId);
if (lRowsDeleted == 1)
{
result = DatabaseOpenHelper.Result.Success;
} else {
result = DatabaseOpenHelper.Result.errCantDeleteData;
}
} else {
result = DatabaseOpenHelper.Result.errTableNotExists;
}
} else {
result = DatabaseOpenHelper.Result.errNoDbAccess;
}
return result;
}
/** 封装的根據ID查詢數據 **/
public DatabaseOpenHelper.Result getRowDataForEdit(long lRowId)
{
DatabaseOpenHelper.Result result = DatabaseOpenHelper.Result.errUnknown;
//get requested data row
Cursor cr = locateDataRow(lRowId);
if (cr == null)
{
//如果返回為空 結果為errCantGetData
result = DatabaseOpenHelper.Result.errCantGetData;
} else {
if (cr.getCount() > 0)
{
if (dataRow.GetValuesFromCursor(cr))
{
try
{
dataRow.GetValuesFromDataRow();
} catch (Exception e) {
return DatabaseOpenHelper.Result.errCantGetValuesFromDataRow;
}
result = DatabaseOpenHelper.Result.Success;
} else {
//無法從表中取出数据
result = DatabaseOpenHelper.Result.errCantGetDataFromTable;
}
//关闭光标
cr.close();
} else {
//无法找到数据
result = DatabaseOpenHelper.Result.errCantFindData;
}
}
return result;
}
/** 得到這個表中的所有字段 **/
public List<String> getColumn() {
List<String> ar = new ArrayList<String>();
try {
DataField[] fields = dataRow.GetTableDef();
for(DataField f : fields){
ar.add(f.GetName());
}
} catch (Exception e) {
e.printStackTrace();
}
return ar;
}
}
安装程序类Installating
public class Installation {
private static String sID = null;
private static final String INSTALLATION = "INSTALLATION";
public synchronized static String id(Context context) {
if (sID == null) {
File installation = new File(context.getFilesDir(), INSTALLATION);
try {
if (!installation.exists()){
writeInstallationFile(installation, context);
}
sID = readInstallationFile(installation);
} catch (Exception e) {
//throw new RuntimeException(e);
}
}
return sID;
}
private static String readInstallationFile(File installation) throws IOException {
RandomAccessFile f = new RandomAccessFile(installation, "r");
byte[] bytes = new byte[(int) f.length()];
f.readFully(bytes);
f.close();
return new String(bytes);
}
private static void writeInstallationFile(File installation, Context context) throws IOException {
FileOutputStream out = new FileOutputStream(installation);
String id = "";
try{
id = Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.ANDROID_ID);
id+=id;
}catch(Exception e){
id = UUID.randomUUID().toString();
}
out.write(id.getBytes());
out.close();
}
}
获取资源类SearchResource
public class SearchResource {
public static int getDrawableResId(Context cnt, String name) throws NotFoundException {
int resid = 0;
resid = cnt.getResources().getIdentifier(name, "drawable", cnt.getPackageName());
if (resid == 0)
resid = cnt.getResources().getIdentifier( "transparent_background", "drawable", cnt.getPackageName());
return resid;
}
public static int getStringResId(Context cnt, String name) throws NotFoundException {
int resid = 0;
resid = cnt.getResources().getIdentifier(name, "string", cnt.getPackageName());
if (resid == 0)
resid = cnt.getResources().getIdentifier("empty_string", "string", cnt.getPackageName());
return resid;
}
public static int getLayoutResId(Context cnt, String name) throws NotFoundException {
int resid = 0;
resid = cnt.getResources().getIdentifier(name, "layout", cnt.getPackageName());
if (resid == 0)
resid = cnt.getResources().getIdentifier("empty_layout","layout", cnt.getPackageName());
return resid;
}
public static int getItemResId(Context cnt, String name) throws NotFoundException {
int resid = cnt.getResources().getIdentifier(name, "id", cnt.getPackageName());
return resid;
}
public static int getAnimResId(Context cnt, String name) throws NotFoundException {
int resid = cnt.getResources().getIdentifier(name, "anim", cnt.getPackageName());
return resid;
}
public static int getAttrResId(Context cnt, String attrName) throws NotFoundException {
int resid = cnt.getResources().getIdentifier(attrName, "attr", cnt.getPackageName());
return resid;
}
public static int getStyleResId(Context cnt, String attrName) throws NotFoundException {
int resid = cnt.getResources().getIdentifier(attrName, "style", cnt.getPackageName());
return resid;
}
public static int getMenuResId(Context cnt, String name) throws NotFoundException {
int resid = cnt.getResources().getIdentifier(name, "menu", cnt.getPackageName());
return resid;
}
public static int[] getStyleableArray(Context cnt, String name) {
return null;
}
}
发送短信类SendMessage
public class SendMessage {
private static final String TAG = "SendMessage";
private Context m_contect;
private ArrayList<HashMap<String, Object>> m_ContactList;
private ArrayList<HashMap<String, Object>> m_ContactListbuffer;
private String m_strMessageContent;
private int m_intMessageSendCount=0;
private int m_intMessageSendTotalParts;
private int m_intMessageSendParts;
public static final String SENT = "com.commez.psmd.SMS_SENT";
public static final String DELIVERED = "com.commez.psmd.SMS_DELIVERED";
private ArrayList<String> m_phoneList;
private ListView m_ltvDialogContactList;
private CustomDialogAdapter m_DialogAdapter;
private Dialog dialog;
private boolean m_isSendCancel;
private static Handler m_handler = new Handler();
private BroadcastReceiver m_bcrSend;
private BroadcastReceiver m_bcrDelivred;
public SendMessage(Context context, ArrayList<HashMap<String, Object>> contactList, String messageContent){
this.m_contect = context;
this.m_strMessageContent = messageContent;
m_ContactListbuffer = new ArrayList<HashMap<String,Object>>(contactList);
m_isSendCancel = false;
fillPhoneNumber();
}
public void startSendMessage(){
showSendingListDialog();
registerBroadCastReceivers();
m_intMessageSendCount = 0;
sendSMS(m_phoneList.get(m_intMessageSendCount).toString(), m_strMessageContent);
}
private void fillPhoneNumber(){
if(m_ContactListbuffer!=null){
m_ContactList = new ArrayList<HashMap<String,Object>>();
HashMap<String , Object> temp;
for(int j=0; j<m_ContactListbuffer.size(); j++){
temp=new HashMap<String, Object>();
if(m_ContactListbuffer.get(j).get("name")!=null)
temp.put("name", m_ContactListbuffer.get(j).get("name").toString());
if(m_ContactListbuffer.get(j).get("number")!=null)
temp.put("number", m_ContactListbuffer.get(j).get("number").toString());
if(m_ContactListbuffer.get(j).get("contentid")!=null)
temp.put("contentid", m_ContactListbuffer.get(j).get("contentid").toString());
if(j==m_intMessageSendCount)
temp.put("sendstatus", "sending");
else
temp.put("sendstatus", "unsend");
m_ContactList.add(temp);
}
m_phoneList = new ArrayList<String>();
for(int i=0; i<m_ContactList.size(); i++){
m_phoneList.add(m_ContactList.get(i).get("number").toString());
}
}
}
private void sendNextMessage(){
if(thereAreSMSToSend()){
//m_phoneList.
//m_DialogAdapter.notifyDataSetChanged();
/*if(m_ContactList!=null)
m_ContactList.clear();
HashMap<String , Object> temp;
for(int j=0; j<m_ContactListbuffer.size(); j++){
temp=new HashMap<String, Object>();
if(m_ContactListbuffer.get(j).get("name")!=null)
temp.put("name", m_ContactListbuffer.get(j).get("name").toString());
if(m_ContactListbuffer.get(j).get("number")!=null)
temp.put("number", m_ContactListbuffer.get(j).get("number").toString());
if(m_ContactListbuffer.get(j).get("contentid")!=null)
temp.put("contentid", m_ContactListbuffer.get(j).get("contentid").toString());
if(j<m_intMessageSendCount)
temp.put("sendstatus", "sent");
else if(j==m_intMessageSendCount)
temp.put("sendstatus", "sending");
else
temp.put("sendstatus", "unsend");
m_ContactList.add(j,temp);
}*/
HashMap<String , Object> temp =new HashMap<String, Object>();
if(m_ContactListbuffer.get(m_intMessageSendCount).get("name")!=null)
temp.put("name", m_ContactListbuffer.get(m_intMessageSendCount).get("name").toString());
if(m_ContactListbuffer.get(m_intMessageSendCount).get("number")!=null)
temp.put("number", m_ContactListbuffer.get(m_intMessageSendCount).get("number").toString());
if(m_ContactListbuffer.get(m_intMessageSendCount).get("contentid")!=null)
temp.put("contentid", m_ContactListbuffer.get(m_intMessageSendCount).get("contentid").toString());
temp.put("sendstatus", "sending");
m_ContactList.set(m_intMessageSendCount,temp);
sendSMS(m_phoneList.get(m_intMessageSendCount).toString(), m_strMessageContent);
m_DialogAdapter.notifyDataSetChanged();
}else{
Toast.makeText(m_contect, "All SMS have been sent",Toast.LENGTH_SHORT).show();
dialog.dismiss();
unRegisterBroadCastReceivers();
}
}
private void unRegisterBroadCastReceivers() {
m_contect.unregisterReceiver(m_bcrSend);
m_contect.unregisterReceiver(m_bcrDelivred);
}
private boolean thereAreSMSToSend(){
return m_intMessageSendCount < m_phoneList.size();
}
private void sendSMS(String strPhoneNumber, String message){
SmsManager sms = SmsManager.getDefault();
ArrayList<String> parts = sms.divideMessage(message);
m_intMessageSendTotalParts = parts.size();
ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>();
ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();
PendingIntent sentPI = PendingIntent.getBroadcast(m_contect, 0, new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(m_contect, 0, new Intent(DELIVERED), 0);
for(int j=0; j<m_intMessageSendTotalParts; j++){
sentIntents.add(sentPI);
deliveryIntents.add(deliveredPI);
}
m_intMessageSendParts = 0;
/**************************************************************/
/* SystemClock.sleep(50);
m_intMessageSendParts++;
if(m_intMessageSendParts == m_intMessageSendTotalParts){
m_intMessageSendCount++;
sendNextMessage();
m_DialogAdapter.notifyDataSetChanged();
}
/******************************************************************/
// sms.sendMultipartTextMessage(strPhoneNumber, null, parts, sentIntents, deliveryIntents);
//m_handler.removeCallbacks(updatTimer);
//m_handler.postDelayed(updatTimer, 3000);
}
private Runnable updatTimer = new Runnable() {
public void run() {
if(m_intMessageSendCount<m_ContactList.size()){
HashMap<String , Object> temp =new HashMap<String, Object>();
if(m_ContactListbuffer.get(m_intMessageSendCount).get("name")!=null)
temp.put("name", m_ContactListbuffer.get(m_intMessageSendCount).get("name").toString());
if(m_ContactListbuffer.get(m_intMessageSendCount).get("number")!=null)
temp.put("number", m_ContactListbuffer.get(m_intMessageSendCount).get("number").toString());
if(m_ContactListbuffer.get(m_intMessageSendCount).get("contentid")!=null)
temp.put("contentid", m_ContactListbuffer.get(m_intMessageSendCount).get("contentid").toString());
temp.put("sendstatus", "sent");
m_ContactList.set(m_intMessageSendCount,temp);
m_intMessageSendCount++;
sendNextMessage();
}
}
};
private void registerBroadCastReceivers() {
IntentFilter intentFilter = new IntentFilter(SENT);
m_bcrSend = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch(getResultCode()){
case Activity.RESULT_OK:
m_intMessageSendParts++;
if(m_intMessageSendParts == m_intMessageSendTotalParts && !m_isSendCancel){
HashMap<String , Object> temp =new HashMap<String, Object>();
if(m_ContactListbuffer.get(m_intMessageSendCount).get("name")!=null)
temp.put("name", m_ContactListbuffer.get(m_intMessageSendCount).get("name").toString());
if(m_ContactListbuffer.get(m_intMessageSendCount).get("number")!=null)
temp.put("number", m_ContactListbuffer.get(m_intMessageSendCount).get("number").toString());
if(m_ContactListbuffer.get(m_intMessageSendCount).get("contentid")!=null)
temp.put("contentid", m_ContactListbuffer.get(m_intMessageSendCount).get("contentid").toString());
temp.put("sendstatus", "sent");
m_ContactList.set(m_intMessageSendCount,temp);
m_intMessageSendCount++;
sendNextMessage();
}
//Toast.makeText(m_contect, "SMS sent",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(m_contect, "Generic failure",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(m_contect, "No service",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(m_contect, "No PDU",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(m_contect, "Radio off",Toast.LENGTH_SHORT).show();
break;
}
}
};
m_contect.registerReceiver(m_bcrSend, intentFilter);
IntentFilter intentFilter1 = new IntentFilter(DELIVERED);
m_bcrDelivred = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch(getResultCode()){
case Activity.RESULT_OK:
break;
case Activity.RESULT_CANCELED:
break;
}
}
};
m_contect.registerReceiver(m_bcrDelivred, intentFilter1);
/*m_contect.registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch(getResultCode()){
case Activity.RESULT_OK:
m_intMessageSendParts++;
if(m_intMessageSendParts == m_intMessageSendTotalParts && !m_isSendCancel){
HashMap<String , Object> temp =new HashMap<String, Object>();
if(m_ContactListbuffer.get(m_intMessageSendCount).get("name")!=null)
temp.put("name", m_ContactListbuffer.get(m_intMessageSendCount).get("name").toString());
if(m_ContactListbuffer.get(m_intMessageSendCount).get("number")!=null)
temp.put("number", m_ContactListbuffer.get(m_intMessageSendCount).get("number").toString());
if(m_ContactListbuffer.get(m_intMessageSendCount).get("contentid")!=null)
temp.put("contentid", m_ContactListbuffer.get(m_intMessageSendCount).get("contentid").toString());
temp.put("sendstatus", "sent");
m_ContactList.set(m_intMessageSendCount,temp);
m_intMessageSendCount++;
sendNextMessage();
}
//Toast.makeText(m_contect, "SMS sent",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(m_contect, "Generic failure",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(m_contect, "No service",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(m_contect, "No PDU",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(m_contect, "Radio off",Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
m_contect.registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch(getResultCode()){
case Activity.RESULT_OK:
break;
case Activity.RESULT_CANCELED:
break;
}
}
}, new IntentFilter(DELIVERED));
*/
}
private void showSendingListDialog() {
LayoutInflater factory = LayoutInflater.from(m_contect);
View dialogView = factory.inflate(R.layout.sms_send_list, null);
m_ltvDialogContactList = (ListView) dialogView.findViewById(R.id.lv_sendlist);
setDialogAdapter();
TextView dialogContent = (TextView) dialogView.findViewById(R.id.dialog_sendlist_content);
dialogContent.setText(R.string.dtl_SendList);
Button rightButton = (Button) dialogView.findViewById(R.id.dialog_sendlist_rightbtn);
rightButton.setText(R.string.dmg_SendBackground);
Button leftButton = (Button) dialogView.findViewById(R.id.dialog_sendlist_leftbtn);
leftButton.setText(R.string.dmg_SendCancel);
rightButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
leftButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog = new Dialog(m_contect);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
dialog.setContentView(dialogView);
dialog.show();
/*dialog = new AlertDialog.Builder(m_contect).setTitle(R.string.dtl_SendList)
.setView(dialogView)
.setPositiveButton(R.string.dmg_SendCancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
m_isSendCancel = true;
unRegisterBroadCastReceivers();
}})
.setNegativeButton(R.string.dmg_SendBackground, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}}).create();
dialog.show();*/
}
private void setDialogAdapter() {
m_DialogAdapter = new CustomDialogAdapter(m_contect, R.layout.sms_send_list_item, m_ContactList);
m_ltvDialogContactList.setAdapter(m_DialogAdapter);
}
private class CustomDialogAdapter extends ArrayAdapter<HashMap<String, Object>> {
public CustomDialogAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Object>> Strings) {
super(context, textViewResourceId, Strings);
}
private class ViewHolder{
TextView txvContact;
TextView txvSendStatus;
ProgressBar prgbSend;
}
ViewHolder viewHolder;
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView==null){
LayoutInflater inflater = (LayoutInflater) m_contect.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
convertView = inflater.inflate(R.layout.sms_send_list_item, null);
viewHolder=new ViewHolder();
viewHolder.txvContact=(TextView) convertView.findViewById(R.id.txvSendlistitem_name);
viewHolder.txvSendStatus=(TextView) convertView.findViewById(R.id.txvSendlistitem_status);
viewHolder.prgbSend=(ProgressBar) convertView.findViewById(R.id.pb_sending);
convertView.setTag(viewHolder);
}
viewHolder=(ViewHolder) convertView.getTag();
viewHolder.txvContact.setText(m_ContactList.get(position).get("number").toString());
String isSend = m_ContactList.get(position).get("sendstatus").toString();
if(isSend=="sent"){
viewHolder.prgbSend.setVisibility(View.GONE);
viewHolder.txvSendStatus.setVisibility(View.VISIBLE);
viewHolder.txvSendStatus.setText(R.string.dmg_Sent);
}else if(isSend=="sending"){
viewHolder.prgbSend.setVisibility(View.VISIBLE);
viewHolder.txvSendStatus.setVisibility(View.GONE);
}else if(isSend=="unsend"){
viewHolder.prgbSend.setVisibility(View.GONE);
viewHolder.txvSendStatus.setVisibility(View.VISIBLE);
viewHolder.txvSendStatus.setText(R.string.dmg_SendWait);
}
return convertView;
}
}
/*public static void sendMessage(Context context, String strAddress, String strMessage){
try {
Uri smsUri = Uri.parse("tel:123456");
Intent intent = new Intent(Intent.ACTION_VIEW, smsUri);
intent.putExtra("sms_body", "");
intent.setType("vnd.android-dir/mms-sms");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
Log.e(TAG, "Send SMS failed", e);
}
}*/
}
时间字符串处理类1:
public class C_DateUtils {
private static final String TAG = C_DateUtils.class.getSimpleName();
/**
* check date is today
* @param date
* @return
*/
public static boolean isToday(Date date){
return isSameDate(new Date(), date);
}
/**
* check Date is same day
* @param baseDate
* @param thenDate
* @return
*/
public static boolean isSameDate(Date baseDate, Date thenDate){
Time time = new Time();
time.set(thenDate.getTime());
int thenYear = time.year;
int thenMonth = time.month;
int thenMonthDay = time.monthDay;
time.set(baseDate.getTime());
return (thenYear == time.year)
&& (thenMonth == time.month)
&& (thenMonthDay == time.monthDay);
}
/**
* caculate day counts between startDate and endDate
* @param startDate
* @param endDate
* @return
*/
public static int diffDays(Date startDate, Date endDate){
return (int)((endDate.getTime() - startDate.getTime()) / DateUtils.DAY_IN_MILLIS);
}
/**
* caculate week counts between startDate and endDate
* @param startDate
* @param endDate
* @return
*/
public static int diffWeeks(Date startDate, Date endDate){
return (int)((endDate.getTime() - startDate.getTime()) / DateUtils.WEEK_IN_MILLIS);
}
/**
* caculate month counts between startDate and endDate
* @param startDate
* @param endDate
* @return
*/
public static int diffMonths(Date startDate, Date endDate){
Time startTime = new Time();
startTime.set(startDate.getTime());
Time endTime = new Time();
endTime.set(endDate.getTime());
int diffYears = endTime.year - startTime.year;
return diffYears * 12 + endTime.month - startTime.month;
}
/**
* caculate year counts between startDate and endDate
* @param startDate
* @param endDate
* @return
*/
public static int diffYears(Date startDate, Date endDate){
Time startTime = new Time();
startTime.set(startDate.getTime());
Time endTime = new Time();
endTime.set(endDate.getTime());
int diffYears = endTime.year - startTime.year;
return diffYears;
}
/**
* return date is Saturday or Sunday
* @param date
* @return
*/
public static boolean isWeekend(Date date){
Time time = new Time();
time.set(date.getTime());
return (time.weekDay == Time.SATURDAY || time.weekDay == Time.SUNDAY);
}
}
时间字符串处理类2:
/**
* 工具類
* @author KrisLight
*
*/
public class Utils
{
/**
* 透明度動畫變化持續時間
*/
public static int ANIM_ALPHA_DURATION = 100;
/**
* 平移動畫持續時間
*/
public static int ANIM_TRANSLATE_DURATION = 30;
/**
* 周別格式 EEEE
*/
private SimpleDateFormat dateFormatWeekDay = new SimpleDateFormat("EEEE");
/**
* 月份格式 MMMM
*/
private SimpleDateFormat dateFormatMonth = new SimpleDateFormat("MMMM");
/**
* 包括年,月,日,周的日期格式 EEEE, d MMMM yyyy
*/
private SimpleDateFormat dateFormatLong = new SimpleDateFormat("EEEE, d MMMM yyyy");
/**
* 包括年,月,日的日期格式 dd-MM-yyyy
*/
private SimpleDateFormat dateFormatShort = new SimpleDateFormat("dd-MM-yyyy");
/**
* Sql中的日期格式 dd-MM-yyyy kk:mm.ss
*/
private SimpleDateFormat dateFormatSql = new SimpleDateFormat("dd-MM-yyyy kk:mm.ss");
//UTILS
public Utils()
{
}
/**
* 得到周別的日期字符串
*/
public String GetWeekDay(Calendar date)
{
return dateFormatWeekDay.format(date.getTime());
}
/**
* 得到月的日期字符串
*/
public String GetMonth(Calendar date)
{
return dateFormatMonth.format(date.getTime());
}
/**
* 得到包括年,月,日,周的日期格式字符串
*/
public String GetLongDate(Calendar date)
{
return dateFormatLong.format(date.getTime());
}
/**
* 得到包括年,月,日的日期格式字符串
*/
public String GetShortDate(Calendar date)
{
return dateFormatShort.format(date.getTime());
}
/**
*
* @Function: pl.magot.vetch.ancal.Utils.GetLongTime
* @Description: 得到時和分
*
* @param date 日期
* @param b24HourMode 是否24小時制: true 是 false 否
* @return 由小時和分鐘組成的字符串 如: 12:20
*
* @version:v1.0
* @author:KrisLight
* @date:2013/9/4 下午4:51:27
*
* Modification History:
* Date Author Version Description
* -----------------------------------------------------------------
* 2013/9/4 KrisLight v1.0.0 create
*/
public String GetLongTime(Calendar date, boolean b24HourMode)
{
String s = "";
if (b24HourMode)
{
//k: 24 小时制的小时 M: 小时中的分钟
s = String.format("%tk:%tM", date, date);
} else {
//l: 12 小时制的小时 M: 小时中的分钟
if (date.get(Calendar.AM_PM) == 0) //AM
s = String.format("%tl:%tM am", date, date, date.get(Calendar.AM_PM));
if (date.get(Calendar.AM_PM) == 1) //PM
s = String.format("%tl:%tM pm", date, date, date.get(Calendar.AM_PM));
}
return s;
}
/**
*
* @Function: pl.magot.vetch.ancal.Utils.SqlStrToDate
* @Description: 將用Sql語句查出來的日期字符串轉換成對應的日期Date
*
* @param s sql format: "dd-MM-yyyy kk:mm.ss"
* @param dateOut 轉換成功的日期
* @param dateFail 轉換失敗默認的日期
* @return
*
* @version:v1.0
* @author:KrisLight
* @date:2013/9/4 下午5:07:40
*
* Modification History:
* Date Author Version Description
* -----------------------------------------------------------------
* 2013/9/4 KrisLight v1.0.0 create
*/
public static Calendar SqlStrToDate(String s, Calendar dateOut, Calendar dateFail)
{
if (s.length() == 19)
{
int dd = Integer.parseInt(s.substring(0, 2));
int MM = Integer.parseInt(s.substring(3, 5));
int yyyy = Integer.parseInt(s.substring(6, 10));
int kk = Integer.parseInt(s.substring(11, 13));
int mm = Integer.parseInt(s.substring(14, 16));
int ss = Integer.parseInt(s.substring(17, 19));
// set(int year, int month, int day, int hourOfDay, int minute, int second) 這裡月從0開始 1月對應的是0
dateOut.set(yyyy, MM - 1, dd, kk, mm, ss);
return dateOut;
}
return dateFail;
}
/**
*
* @Function: pl.magot.vetch.ancal.Utils.DateToSqlStr
* @Description:將日期轉換成SQL中需要的日期格式
*
* @param date
* @return
*
* @version:v1.0
* @author:KrisLight
* @date:2013/9/4 下午5:11:29
*
* Modification History:
* Date Author Version Description
* -----------------------------------------------------------------
* 2013/9/4 KrisLight v1.0.0 create
*/
public String DateToSqlStr(Calendar date)
{
return dateFormatSql.format(date.getTime());
}
/**
* 將時間轉換成秒
*/
public static int GetTimeAsSeconds(Calendar date)
{
return (date.get(Calendar.HOUR_OF_DAY) * 3600) +
date.get(Calendar.MINUTE) * 60;
}
/**
* 清除日期
*/
public static void ClearCalendarTime(Calendar cal)
{
cal.clear(Calendar.MILLISECOND);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.HOUR_OF_DAY);
}
/**
* 判斷日期是否相等
*/
public static boolean YearDaysEqual(Calendar calDate, Calendar calDateTo)
{
if (calDate.get(Calendar.YEAR) == calDateTo.get(Calendar.YEAR))
if (calDate.get(Calendar.MONTH) == calDateTo.get(Calendar.MONTH))
if (calDate.get(Calendar.DAY_OF_MONTH) == calDateTo.get(Calendar.DAY_OF_MONTH))
return true;
return false;
}
/**
* 判斷前一個日期是否大於后一個
*/
public static boolean YearDaysGreater(Calendar calDate, Calendar calDateTo)
{
if (calDate.get(Calendar.YEAR) >= calDateTo.get(Calendar.YEAR))
if (calDate.get(Calendar.MONTH) >= calDateTo.get(Calendar.MONTH))
if (calDate.get(Calendar.DAY_OF_MONTH) >= calDateTo.get(Calendar.DAY_OF_MONTH))
return true;
return false;
}
/**
* 判斷前一個時間是否等於或晚於後面一個時間
* 用於設置鬧鐘的時候與當前時間判斷
* 設置的鬧鈴時間必須晚於當前時間
*/
public static boolean IsTimeOverdued(Calendar calDate, Calendar calDueDate)
{
if ((calDueDate.compareTo(calDate) == 0) || (calDueDate.compareTo(calDate) == 1))
return true;
return false;
}
//compare time: for calendar view display
public static boolean IsInTimeRange(Calendar calDateStart, Calendar calDate, int iDurationInMinutes)
{
if (calDate.get(Calendar.HOUR_OF_DAY) == calDateStart.get(Calendar.HOUR_OF_DAY))
if (calDate.get(Calendar.MINUTE) >= calDateStart.get(Calendar.MINUTE))
if (calDate.get(Calendar.MINUTE) <= (calDateStart.get(Calendar.MINUTE) + iDurationInMinutes))
return true;
return false;
}
/**
* 將時間轉換成long類型 形如: 200712122359
*/
public static long GetDateTimeKey(Calendar calDate)
{
long lYear = calDate.get(Calendar.YEAR) * 100000000;
long lMonth = calDate.get(Calendar.MONTH) * 1000000;
long lDay = calDate.get(Calendar.DAY_OF_MONTH) * 10000;
long lHour = calDate.get(Calendar.HOUR_OF_DAY) * 100;
long lMinute = calDate.get(Calendar.MINUTE);
return lYear + lMonth + lDay + lHour + lMinute;
}
/**
* 首字母大寫
*/
public static String CapitalizeFirstLetter(String sText)
{
return sText.substring(0,1).toUpperCase() + sText.substring(1, sText.length()).toLowerCase();
}
/**
* 得到App版本
*/
public static String getAppVersionName(Context ctx)
{
try
{
PackageInfo pi = ctx.getPackageManager().getPackageInfo("pl.magot.vetch.ancal", 0);
return pi.versionName;
} catch (NameNotFoundException e) {
}
return "";
}
/**
*
* @Function: com.light.mycal.util.Utils.join
* @Description: 集合中的元素以指定分隔符隔開
*
* @param list 集合List
* @param delim 分隔符
* @return 用分隔符隔開的集合元素字符串
*
* @version: v1.0
* @author: KrisLight
* @date: 2013/9/5 上午10:20:51
*
* Modification History:
* Date Author Version Description
* -----------------------------------------------------------------
* 2013/9/5 KrisLight v1.0.0 create
*/
public static String join(List<String> list, String delim) {
StringBuilder buf = new StringBuilder();
int num = list.size();
for (int i = 0; i < num; i++) {
if (i != 0){
buf.append(delim);
}
buf.append((String) list.get(i));
}
return buf.toString();
}
/**
* 開始alpha動畫
*/
public static void startAlphaAnimIn(View view)
{
AlphaAnimation anim = new AlphaAnimation(0.5F, 1);
anim.setDuration(ANIM_ALPHA_DURATION);
anim.startNow();
view.startAnimation(anim);
}
/**
* 開始translate動畫
*/
public static void startTranslateAnimIn(View view)
{
TranslateAnimation anim = new TranslateAnimation(0, 0, - view.getHeight(), 0);
anim.setDuration(ANIM_TRANSLATE_DURATION);
anim.startNow();
view.startAnimation(anim);
}
}
图像处理类
1.图像缓存
public class BitmapCache {
private static final
String TAG = "ImageCache";
private static final int
DEFAULT_MEM_CACHE_SIZE = 1024 * 1024 * 8; // 8MB
private static final int DEFAULT_DISK_CACHE_SIZE = 1024 *
1024 * 20; // 20MB
// Compression settings when
writing images to disk cache
private static final
CompressFormat DEFAULT_COMPRESS_FORMAT =
CompressFormat.JPEG;
private static final int
DEFAULT_COMPRESS_QUALITY = 70;
private static final
int DISK_CACHE_INDEX = 0;
// Constants to easily
toggle various caches
private static final boolean
DEFAULT_MEM_CACHE_ENABLED = true;
private static final
boolean DEFAULT_DISK_CACHE_ENABLED = true;
private
static final boolean DEFAULT_CLEAR_DISK_CACHE_ON_START =
false;
private static final boolean
DEFAULT_INIT_DISK_CACHE_ON_CREATE = false;
private
LruDiskCache mDiskLruCache;
private
LruMemoryCache<String, Bitmap> mMemoryCache;
private
ImageCacheParams mCacheParams;
private final Object
mDiskCacheLock = new Object();
private boolean
mDiskCacheStarting = true;
/**
* Creating a new
ImageCache object using the specified parameters.
*
* @param cacheParams The cache parameters to use to
initialize the cache
*/
public BitmapCache
(ImageCacheParams cacheParams) {
init
(cacheParams);
}
/**
* Initialize the cache,
providing all parameters.
*
* @param cacheParams
The cache parameters to initialize the cache
*/
private void init(ImageCacheParams cacheParams) {
mCacheParams = cacheParams;
// Set up memory cache
if (mCacheParams.memoryCacheEnabled) {
mMemoryCache = new LruMemoryCache<String, Bitmap>
(mCacheParams.memCacheSize) {
/**
* Measure item size in bytes rather than units
which is more practical
* for a bitmap
cache
*/
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return BitmapCommonUtils.getBitmapSize
(bitmap);
}
};
}
// By default the disk cache is not initialized here as
it should be initialized
// on a separate thread
due to disk access.
if
(cacheParams.initDiskCacheOnCreate) {
// Set
up disk cache
initDiskCache();
}
}
/**
* Initializes the disk cache. Note that this
includes disk access so this should not be
* executed
on the main/UI thread. By default an ImageCache does not
initialize the disk
* cache when it is created,
instead you should call initDiskCache() to initialize it
on a
* background thread.
*/
public void
initDiskCache() {
// Set up disk cache
synchronized (mDiskCacheLock) {
if
(mDiskLruCache == null || mDiskLruCache.isClosed()) {
File diskCacheDir = mCacheParams.diskCacheDir;
if (mCacheParams.diskCacheEnabled &&
diskCacheDir != null) {
if (!
diskCacheDir.exists()) {
diskCacheDir.mkdirs();
}
if (BitmapCommonUtils.getUsableSpace(diskCacheDir) >
mCacheParams.diskCacheSize) {
try
{
mDiskLruCache =
LruDiskCache.open(diskCacheDir, 1, 1,
mCacheParams.diskCacheSize);
}
catch (final IOException e) {
mCacheParams.diskCacheDir = null;
Log.e(TAG, "initDiskCache - " + e);
}
}
}
}
mDiskCacheStarting = false;
mDiskCacheLock.notifyAll();
}
}
/**
*
Adds a bitmap to both memory and disk cache.
* @param
data Unique identifier for the bitmap to store
*
@param bitmap The bitmap to store
*/
public void
addBitmapToCache(String data, Bitmap bitmap) {
if
(data == null || bitmap == null) {
return;
}
// Add to memory cache
if
(mMemoryCache != null && mMemoryCache.get(data) == null)
{
mMemoryCache.put(data, bitmap);
}
synchronized (mDiskCacheLock) {
if
(mDiskLruCache != null && mDiskLruCache.getDirectory()!=
null ) {
if(!
mDiskLruCache.getDirectory().exists())
mDiskLruCache.getDirectory().mkdirs();
final String key =
FileNameGenerator.generator(data);
OutputStream out = null;
try {
LruDiskCache.Snapshot snapshot =
mDiskLruCache.get(key);
if (snapshot
== null) {
final
LruDiskCache.Editor editor = mDiskLruCache.edit(key);
if (editor != null) {
out = editor.newOutputStream(DISK_CACHE_INDEX);
bitmap.compress(
mCacheParams.compressFormat,
mCacheParams.compressQuality, out);
editor.commit();
out.close();
}
} else {
snapshot.getInputStream
(DISK_CACHE_INDEX).close();
}
} catch (final IOException e) {
Log.e(TAG, "addBitmapToCache - " + e);
}
catch (Exception e) {
Log.e(TAG,
"addBitmapToCache - " + e);
} finally {
try {
if (out !=
null) {
out.close();
}
} catch (IOException e)
{}
}
}
}
}
/**
* Get from memory cache.
*
* @param data Unique
identifier for which item to get
* @return The bitmap
if found in cache, null otherwise
*/
public Bitmap
getBitmapFromMemCache(String data) {
if
(mMemoryCache != null) {
final Bitmap
memBitmap = mMemoryCache.get(data);
if
(memBitmap != null) {
return memBitmap;
}
}
return null;
}
/**
*
@param data
* @return
*/
public Bitmap
getBitmapFromDiskCache(String data) {
final
String key = FileNameGenerator.generator(data);
synchronized (mDiskCacheLock) {
while
(mDiskCacheStarting) {
try {
mDiskCacheLock.wait();
} catch
(InterruptedException e) {}
}
if
(mDiskLruCache != null) {
InputStream
inputStream = null;
try {
final LruDiskCache.Snapshot snapshot =
mDiskLruCache.get(key);
if (snapshot
!= null) {
inputStream =
snapshot.getInputStream(DISK_CACHE_INDEX);
if (inputStream != null) {
final Bitmap bitmap = BitmapFactory.decodeStream
(inputStream);
return bitmap;
}
}
} catch (final IOException e) {
Log.e(TAG, "getBitmapFromDiskCache - " + e);
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {}
}
}
return null;
}
}
/**
*
Clears both the memory and disk cache associated with
this ImageCache object. Note that
* this includes
disk access so this should not be executed on the main/UI
thread.
*/
public void clearCache() {
clearMemoryCache();
synchronized (mDiskCacheLock)
{
mDiskCacheStarting = true;
if
(mDiskLruCache != null && !mDiskLruCache.isClosed()) {
try {
mDiskLruCache.delete();
} catch
(IOException e) {
Log.e(TAG,
"clearCache - " + e);
}
mDiskLruCache = null;
initDiskCache();
}
}
}
public void
clearMemoryCache(){
if (mMemoryCache != null) {
mMemoryCache.evictAll();
}
}
/**
*
Flushes the disk cache associated with this ImageCache
object. Note that this includes
* disk access so this
should not be executed on the main/UI thread.
*/
public void flush() {
synchronized
(mDiskCacheLock) {
if (mDiskLruCache != null)
{
try {
mDiskLruCache.flush();
} catch
(IOException e) {
Log.e(TAG, "flush -
" + e);
}
}
}
}
/**
* Closes the disk cache associated with this
ImageCache object. Note that this includes
* disk
access so this should not be executed on the main/UI
thread.
*/
public void close() {
synchronized (mDiskCacheLock) {
if
(mDiskLruCache != null) {
try {
if (!mDiskLruCache.isClosed()) {
mDiskLruCache.close();
mDiskLruCache = null;
}
} catch (IOException e) {
Log.e(TAG,
"close - " + e);
}
}
}
}
/**
* A holder class that contains cache
parameters.
*/
public static class
ImageCacheParams {
public int memCacheSize =
DEFAULT_MEM_CACHE_SIZE;
public int diskCacheSize =
DEFAULT_DISK_CACHE_SIZE;
public File diskCacheDir;
public CompressFormat compressFormat =
DEFAULT_COMPRESS_FORMAT;
public int
compressQuality = DEFAULT_COMPRESS_QUALITY;
public
boolean memoryCacheEnabled = DEFAULT_MEM_CACHE_ENABLED;
public boolean diskCacheEnabled =
DEFAULT_DISK_CACHE_ENABLED;
public boolean
clearDiskCacheOnStart =
DEFAULT_CLEAR_DISK_CACHE_ON_START;
public boolean
initDiskCacheOnCreate =
DEFAULT_INIT_DISK_CACHE_ON_CREATE;
public
ImageCacheParams(File diskCacheDir) {
this.diskCacheDir = diskCacheDir;
}
public ImageCacheParams(String diskCacheDir) {
this.diskCacheDir = new File(diskCacheDir);
}
/**
* @param context棿
*/
public
void setMemCacheSizePercent(Context context, float
percent) {
if (percent < 0.05f || percent >
0.8f) {
throw new
IllegalArgumentException("setMemCacheSizePercent -
percent must be "
+ "between 0.05
and 0.8 (inclusive)");
}
memCacheSize = Math.round(percent * getMemoryClass
(context) * 1024 * 1024);
}
public void setMemCacheSize(int memCacheSize) {
this.memCacheSize = memCacheSize;
}
public void setDiskCacheSize(int diskCacheSize) {
this.diskCacheSize = diskCacheSize;
}
private static int getMemoryClass(Context
context) {
return ((ActivityManager)
context.getSystemService(
Context.ACTIVITY_SERVICE)).getMemoryClass();
}
}
}
图像处理类
public class BitmapCommonUtils {
private static final String TAG = "BitmapCommonUtils";
/**
* @param context
* @return
*/
public static File getDiskCacheDir(Context context, String uniqueName) {
final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ?
getExternalCacheDir(context).getPath() : context.getCacheDir().getPath();
return new File(cachePath + File.separator + uniqueName);
}
/**
* @param bitmap
* @return
*/
public static int getBitmapSize(Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
/**
* @param context
* @return
*/
public static File getExternalCacheDir(Context context) {
final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/";
return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir);
}
/**
* @param path
* @return
*/
public static long getUsableSpace(File path) {
try{
final StatFs stats = new StatFs(path.getPath());
return (long) stats.getBlockSize() * (long) stats.getAvailableBlocks();
}catch (Exception e) {
e.printStackTrace();
return -1;
}
}
}
图像Decoder类
public class BitmapDecoder {
private static final String TAG = "BitmapDecoder";
private BitmapDecoder(){}
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inPurgeable = true;
BitmapFactory.decodeResource(res, resId, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
try {
return BitmapFactory.decodeResource(res, resId, options);
} catch (OutOfMemoryError e) {
e.printStackTrace();
return null;
}
}
public static Bitmap decodeSampledBitmapFromFile(String filename,int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inPurgeable = true;
BitmapFactory.decodeFile(filename, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
try {
return BitmapFactory.decodeFile(filename, options);
} catch (OutOfMemoryError e) {
e.printStackTrace();
return null;
}
}
public static Bitmap decodeSampledBitmapFromDescriptor(FileDescriptor fileDescriptor, int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inPurgeable = true;
BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
try {
return BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
} catch (OutOfMemoryError e) {
// Log.e(TAG, "decodeSampledBitmapFromDescriptor");
e.printStackTrace();
return null;
}
}
public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float) height / (float) reqHeight);
} else {
inSampleSize = Math.round((float) width / (float) reqWidth);
}
final float totalPixels = width * height;
final float totalReqPixelsCap = reqWidth * reqHeight * 2;
while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) {
inSampleSize++;
}
}
return inSampleSize;
}
}
图像显示配置类
public class BitmapDisplayConfig {
private int bitmapWidth;
private int bitmapHeight;
private Animation animation;
private int animationType;
private Bitmap loadingBitmap;
private Bitmap loadfailBitmap;
public int getBitmapWidth() {
return bitmapWidth;
}
public void setBitmapWidth(int bitmapWidth) {
this.bitmapWidth = bitmapWidth;
}
public int getBitmapHeight() {
return bitmapHeight;
}
public void setBitmapHeight(int bitmapHeight) {
this.bitmapHeight = bitmapHeight;
}
public Animation getAnimation() {
return animation;
}
public void setAnimation(Animation animation) {
this.animation = animation;
}
public int getAnimationType() {
return animationType;
}
public void setAnimationType(int animationType) {
this.animationType = animationType;
}
public Bitmap getLoadingBitmap() {
return loadingBitmap;
}
public void setLoadingBitmap(Bitmap loadingBitmap) {
this.loadingBitmap = loadingBitmap;
}
public Bitmap getLoadfailBitmap() {
return loadfailBitmap;
}
public void setLoadfailBitmap(Bitmap loadfailBitmap) {
this.loadfailBitmap = loadfailBitmap;
}
public class AnimationType{
public static final int userDefined = 0;
public static final int fadeIn = 1;
}
}
public class BitmapProcess {
private static final String TAG = "BitmapProcess";
private boolean mHttpDiskCacheStarting = true;
private int cacheSize;
private static final int DEFAULT_CACHE_SIZE = 20 * 1024 * 1024; // 20MB
private LruDiskCache mOriginalDiskCache;
private final Object mHttpDiskCacheLock = new Object();
private static final int DISK_CACHE_INDEX = 0;
private File mOriginalCacheDir;
private Downloader downloader;
private boolean neverCalculate = false;
public BitmapProcess(Downloader downloader,String filePath,int cacheSize) {
this.mOriginalCacheDir = new File(filePath+"/original");
this.downloader = downloader;
if(cacheSize<=0)
cacheSize = DEFAULT_CACHE_SIZE;
this.cacheSize = cacheSize;
}
public void configCalculateBitmap(boolean neverCalculate){
this.neverCalculate = neverCalculate;
}
public Bitmap processBitmap(String data, BitmapDisplayConfig config) {
final String key = FileNameGenerator.generator(data);
FileDescriptor fileDescriptor = null;
FileInputStream fileInputStream = null;
LruDiskCache.Snapshot snapshot;
synchronized (mHttpDiskCacheLock) {
// Wait for disk cache to initialize
while (mHttpDiskCacheStarting) {
try {
mHttpDiskCacheLock.wait();
} catch (InterruptedException e) {
}
}
if (mOriginalDiskCache != null) {
try {
snapshot = mOriginalDiskCache.get(key);
if (snapshot == null) {
LruDiskCache.Editor editor = mOriginalDiskCache.edit(key);
if (editor != null) {
if (downloader.downloadToLocalStreamByUrl(data,editor.newOutputStream(DISK_CACHE_INDEX))) {
editor.commit();
} else {
editor.abort();
}
}
snapshot = mOriginalDiskCache.get(key);
}
if (snapshot != null) {
fileInputStream = (FileInputStream) snapshot.getInputStream(DISK_CACHE_INDEX);
fileDescriptor = fileInputStream.getFD();
}
} catch (IOException e) {
Log.e(TAG, "processBitmap - " + e);
} catch (IllegalStateException e) {
Log.e(TAG, "processBitmap - " + e);
} finally {
if (fileDescriptor == null && fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
}
}
}
}
}
Bitmap bitmap = null;
if (fileDescriptor != null) {
if(neverCalculate)
bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
else
bitmap = BitmapDecoder.decodeSampledBitmapFromDescriptor(fileDescriptor, config.getBitmapWidth(),config.getBitmapHeight());
}
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
}
}
return bitmap;
}
public void initHttpDiskCache() {
if (!mOriginalCacheDir.exists()) {
mOriginalCacheDir.mkdirs();
}
synchronized (mHttpDiskCacheLock) {
if (BitmapCommonUtils.getUsableSpace(mOriginalCacheDir) > cacheSize) {
try {
mOriginalDiskCache = LruDiskCache.open(mOriginalCacheDir, 1, 1,cacheSize);
} catch (IOException e) {
mOriginalDiskCache = null;
}
}
mHttpDiskCacheStarting = false;
mHttpDiskCacheLock.notifyAll();
}
}
public void clearCacheInternal() {
synchronized (mHttpDiskCacheLock) {
if (mOriginalDiskCache != null && !mOriginalDiskCache.isClosed()) {
try {
mOriginalDiskCache.delete();
} catch (IOException e) {
Log.e(TAG, "clearCacheInternal - " + e);
}
mOriginalDiskCache = null;
mHttpDiskCacheStarting = true;
initHttpDiskCache();
}
}
}
public void flushCacheInternal() {
synchronized (mHttpDiskCacheLock) {
if (mOriginalDiskCache != null) {
try {
mOriginalDiskCache.flush();
} catch (IOException e) {
Log.e(TAG, "flush - " + e);
}
}
}
}
public void closeCacheInternal() {
synchronized (mHttpDiskCacheLock) {
if (mOriginalDiskCache != null) {
try {
if (!mOriginalDiskCache.isClosed()) {
mOriginalDiskCache.close();
mOriginalDiskCache = null;
}
} catch (IOException e) {
Log.e(TAG, "closeCacheInternal - " + e);
}
}
}
}
}
下载类
public interface Downloader {
public boolean downloadToLocalStreamByUrl(String urlString, OutputStream outputStream);
}
public class SimpleHttpDownloader implements Downloader{
private static final String TAG = "BitmapDownloader";
private static final int IO_BUFFER_SIZE = 8 * 1024; //8k
public boolean downloadToLocalStreamByUrl(String urlString, OutputStream outputStream) {
HttpURLConnection urlConnection = null;
BufferedOutputStream out = null;
FlushedInputStream in = null;
try {
final URL url = new URL(urlString);
urlConnection = (HttpURLConnection) url.openConnection();
in = new FlushedInputStream(new BufferedInputStream(urlConnection.getInputStream(), IO_BUFFER_SIZE));
out = new BufferedOutputStream(outputStream, IO_BUFFER_SIZE);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
return true;
} catch (final IOException e) {
Log.e(TAG, "Error in downloadBitmap - "+urlString +" : " + e);
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (final IOException e) {}
}
return false;
}
public class FlushedInputStream extends FilterInputStream {
public FlushedInputStream(InputStream inputStream) {
super(inputStream);
}
@Override
public long skip(long n) throws IOException {
long totalBytesSkipped = 0L;
while (totalBytesSkipped < n) {
long bytesSkipped = in.skip(n - totalBytesSkipped);
if (bytesSkipped == 0L) {
int by_te = read();
if (by_te < 0) {
break; // we reached EOF
} else {
bytesSkipped = 1; // we read one byte
}
}
totalBytesSkipped += bytesSkipped;
}
return totalBytesSkipped;
}
}
}