现在的位置: 首页 > 综合 > 正文

常用工具类总结

2014年08月29日 ⁄ 综合 ⁄ 共 60694字 ⁄ 字号 评论关闭

项目中常会遇到的工具类 总结留存

首先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();
	}
}


配置文件工具Prefs

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;
	    	}
	    }
}

抱歉!评论已关闭.