开源中国Gson解析封装
因为开源中国是使用xml的形式来进行数据的传递,今天特意改成gson的格式,希望大家喜欢.上代码啦,可能有很多不需要的东西,你们自己看着办吧,核心
的都已经在里面了.需要gson-2.2.2.jar包与commons-httclient-3.1.jar包,在我资源里面都有
首先看下我的目录结构 
AppConfig
package net.driver.app;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.Properties;import android.content.Context;/** * 应用程序配置类:用于保存用户相关信息及设置 * * @author Bert Guo * @created 2013-3-28 */public class AppConfig {private final static String APP_CONFIG = "config";public final static String TEMP_TWEET = "temp_tweet";public final static String TEMP_TWEET_IMAGE = "temp_tweet_image";public final static String TEMP_MESSAGE = "temp_message";public final static String TEMP_COMMENT = "temp_comment";public final static String TEMP_POST_TITLE = "temp_post_title";public final static String TEMP_POST_CATALOG = "temp_post_catalog";public final static String TEMP_POST_CONTENT = "temp_post_content";public final static String CONF_APP_UNIQUEID = "APP_UNIQUEID";public final static String CONF_COOKIE = "cookie";public final static String CONF_ACCESSTOKEN = "accessToken";public final static String CONF_ACCESSSECRET = "accessSecret";public final static String CONF_EXPIRESIN = "expiresIn";public final static String CONF_LOAD_IMAGE = "perf_loadimage";public final static String CONF_SCROLL = "perf_scroll";public final static String CONF_HTTPS_LOGIN = "perf_httpslogin";public final static String CONF_VOICE = "perf_voice";private Context mContext;private static AppConfig appConfig;public static AppConfig getAppConfig(Context context) {if (appConfig == null) {appConfig = new AppConfig();appConfig.mContext = context;}return appConfig;}public String get(String key) {Properties props = get();return (props != null) ? props.getProperty(key) : null;}public Properties get() {FileInputStream fis = null;Properties props = new Properties();try {// 读取files目录下的config// fis = activity.openFileInput(APP_CONFIG);// 读取app_config目录下的configFile dirConf = mContext.getDir(APP_CONFIG, Context.MODE_PRIVATE);fis = new FileInputStream(dirConf.getPath() + File.separator+ APP_CONFIG);props.load(fis);} catch (Exception e) {} finally {try {fis.close();} catch (Exception e) {}}return props;}public void set(String key, String value) {Properties props = get();props.setProperty(key, value);setProps(props);}public void remove(String...key) {Properties props = get();for(String k : key)props.remove(k);setProps(props);}private void setProps(Properties p) {FileOutputStream fos = null;try {// 把config建在files目录下// fos = activity.openFileOutput(APP_CONFIG, Context.MODE_PRIVATE);// 把config建在(自定义)app_config的目录下File dirConf = mContext.getDir(APP_CONFIG, Context.MODE_PRIVATE);File conf = new File(dirConf, APP_CONFIG);fos = new FileOutputStream(conf);p.store(fos, null);fos.flush();} catch (Exception e) {e.printStackTrace();} finally {try {fos.close();} catch (Exception e) {}}}}
AppContext
package net.driver.app;import java.util.UUID;import net.driver.app.api.ApiClient;import net.driver.app.common.StringUtils;import android.app.Application;import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager.NameNotFoundException;/** * 全局应用程序类:用于保存和调用全局应用配置及访问网络数据 * * @author Bert Guo 2013-2-27 */public class AppContext extends Application {private static AppContext mInstance = null;private boolean login = false;//登录状态private int loginUid = 0;//登录用户的id@Overridepublic void onCreate() {//注册App异常崩溃处理器 Thread.setDefaultUncaughtExceptionHandler(AppException.getAppExceptionHandler());mInstance = this;initEngineManager(this);}@Override// 建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗public void onTerminate() {// TODO Auto-generated method stubsuper.onTerminate();}public void initEngineManager(Context context) {}/** * 获取应用程序实例 单例模式中获取唯一的Application 实例 * * @return 当前应用程序 */public static AppContext getInstance() {if (null == mInstance) {mInstance = new AppContext();}return mInstance;}/** * 获取App安装包信息 * @return */public PackageInfo getPackageInfo() {PackageInfo info = null;try {info = getPackageManager().getPackageInfo(getPackageName(), 0);} catch (NameNotFoundException e) {e.printStackTrace(System.err);}if (info == null)info = new PackageInfo();return info;}/** * 获取App唯一标识 * @return */public String getAppId() {String uniqueID = getProperty(AppConfig.CONF_APP_UNIQUEID);if(StringUtils.isEmpty(uniqueID)){uniqueID = UUID.randomUUID().toString();setProperty(AppConfig.CONF_APP_UNIQUEID, uniqueID);}return uniqueID;}/** * 清除保存的缓存 */public void cleanCookie() {removeProperty(AppConfig.CONF_COOKIE);}public void removeProperty(String...key) {AppConfig.getAppConfig(this).remove(key);}/** * 用户注销 */public void Logout() {ApiClient.cleanCookie();this.cleanCookie();this.login = false;this.loginUid = 0;}public void setProperty(String key,String value){AppConfig.getAppConfig(this).set(key, value);}public String getProperty(String key){return AppConfig.getAppConfig(this).get(key);}}
AppException
package net.driver.app;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.lang.Thread.UncaughtExceptionHandler;import java.net.ConnectException;import java.net.SocketException;import java.net.UnknownHostException;import java.util.Date;import net.driver.app.common.UIHelper;import org.apache.http.HttpException;import android.content.Context;import android.content.pm.PackageInfo;import android.os.Environment;import android.os.Looper;import android.widget.Toast;/** * 应用程序异常类:用于捕获异常和提示错误信息 * * @author Bert Guo * @version 1.0 * @created 2013-3-28 */public class AppException extends Exception implements UncaughtExceptionHandler {/** 系统默认的UncaughtException处理类 */private Thread.UncaughtExceptionHandler mDefaultHandler;private final static boolean Debug = false;//是否保存错误日志/** 定义异常类型 */public final static byte TYPE_NETWORK = 0x01;public final static byte TYPE_SOCKET= 0x02;public final static byte TYPE_HTTP_CODE= 0x03;public final static byte TYPE_HTTP_ERROR= 0x04;public final static byte TYPE_XML = 0x05;public final static byte TYPE_IO = 0x06;public final static byte TYPE_RUN = 0x07;public final static byte TYPE_UNSUPPORTEDENCODING = 0x08;private static final byte TYPE_CLIENTPROTOCOL = 0x09;private static final byte TYPE_CONNECTTIMEOUT = 0x10;private byte type;private int code;private AppException(){this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();}private AppException(byte type, int code, Exception excp) {super(excp);this.type = type;this.code = code;if(Debug){this.saveErrorLog(excp);}}public int getCode() {return this.code;}public int getType() {return this.type;}@Overridepublic void uncaughtException(Thread thread, Throwable ex) {// TODO Auto-generated method stubif(!handleException(ex) && mDefaultHandler != null) {mDefaultHandler.uncaughtException(thread, ex);}}/** * 获取APP异常崩溃处理对象 * @param context * @return */public static AppException getAppExceptionHandler(){return new AppException();}/** * 提示友好的错误信息 * @param ctx */public void makeToast(Context ctx){switch(this.getType()){case TYPE_HTTP_CODE:String err = ctx.getString(R.string.http_status_code_error, this.getCode());Toast.makeText(ctx, err, Toast.LENGTH_SHORT).show();break;case TYPE_HTTP_ERROR:Toast.makeText(ctx, R.string.http_exception_error, Toast.LENGTH_SHORT).show();break;case TYPE_SOCKET:Toast.makeText(ctx, R.string.socket_exception_error, Toast.LENGTH_SHORT).show();break;case TYPE_NETWORK:Toast.makeText(ctx, R.string.network_not_connected, Toast.LENGTH_SHORT).show();break;case TYPE_XML:Toast.makeText(ctx, R.string.xml_parser_failed, Toast.LENGTH_SHORT).show();break;case TYPE_IO:Toast.makeText(ctx, R.string.io_exception_error, Toast.LENGTH_SHORT).show();break;case TYPE_RUN:Toast.makeText(ctx, R.string.app_run_code_error, Toast.LENGTH_SHORT).show();break;}}/** * 保存异常日志 * @param excp */public void saveErrorLog(Exception excp) {String errorlog = "errorlog.txt";String savePath = "";String logFilePath = "";FileWriter fw = null;PrintWriter pw = null;try {//判断是否挂载了SD卡String storageState = Environment.getExternalStorageState();if(storageState.equals(Environment.MEDIA_MOUNTED)){savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/OSChina/Log/";File file = new File(savePath);if(!file.exists()){file.mkdirs();}logFilePath = savePath + errorlog;}//没有挂载SD卡,无法写文件if(logFilePath == ""){return;}File logFile = new File(logFilePath);if (!logFile.exists()) {logFile.createNewFile();}fw = new FileWriter(logFile,true);pw = new PrintWriter(fw);pw.println("--------------------"+(new Date().toLocaleString())+"---------------------");excp.printStackTrace(pw);pw.close();fw.close();} catch (Exception e) {e.printStackTrace();}finally{ if(pw != null){ pw.close(); } if(fw != null){ try { fw.close(); } catch (IOException e) { }}}}/** * 自定义异常处理:收集错误信息&发送错误报告 * @param ex * @return true:处理了该异常信息;否则返回false */private boolean handleException(Throwable ex) {if(ex == null) {return false;}final Context context = AppManager.getAppManager().currentActivity();if(context == null) {return false;}final String crashReport = getCrashReport(context, ex);//显示异常信息&发送报告new Thread() {public void run() {Looper.prepare();UIHelper.sendAppCrashReport(context, crashReport);Looper.loop();}}.start();return true;}public static AppException socket(Exception e) {return new AppException(TYPE_SOCKET, 0 ,e);}public static AppException io(Exception e) {if(e instanceof UnknownHostException || e instanceof ConnectException){return new AppException(TYPE_NETWORK, 0, e);}else if(e instanceof IOException){return new AppException(TYPE_IO, 0 ,e);}return run(e);}public static AppException xml(Exception e) {return new AppException(TYPE_XML, 0, e);}public static AppException network(Exception e) {if(e instanceof UnknownHostException || e instanceof ConnectException){return new AppException(TYPE_NETWORK, 0, e);}else if(e instanceof HttpException){return http(e);}else if(e instanceof SocketException){return socket(e);}return http(e);}public static AppException unsupportedencoding(Exception e) {return new AppException(TYPE_UNSUPPORTEDENCODING, 0, e);}public static AppException clientprotocol(Exception e) {return new AppException(TYPE_CLIENTPROTOCOL, 0, e);}public static AppException connecttimeout(Exception e) {return new AppException(TYPE_CONNECTTIMEOUT, 0, e);}public static AppException run(Exception e) {return new AppException(TYPE_RUN, 0, e);}/** * 获取APP崩溃异常报告 * @param ex * @return */private String getCrashReport(Context context, Throwable ex) {PackageInfo pinfo = ((AppContext)context.getApplicationContext()).getPackageInfo();StringBuffer exceptionStr = new StringBuffer();exceptionStr.append("Version: "+pinfo.versionName+"("+pinfo.versionCode+")\n");exceptionStr.append("Android: "+android.os.Build.VERSION.RELEASE+"("+android.os.Build.MODEL+")\n");exceptionStr.append("Exception: "+ex.getMessage()+"\n");StackTraceElement[] elements = ex.getStackTrace();for (int i = 0; i < elements.length; i++) {exceptionStr.append(elements[i].toString()+"\n");}return exceptionStr.toString();}public static AppException http(int code) {return new AppException(TYPE_HTTP_CODE, code, null);}public static AppException http(Exception e) {return new AppException(TYPE_HTTP_ERROR, 0 ,e);}}
AppManager
package net.driver.app;import java.util.Stack;import android.app.Activity;import android.app.ActivityManager;import android.content.Context;/** * 应用程序Activity管理类:用于Activity管理和应用程序退出 * * @author Bert Guo * @version 1.0 * @created 2013-3-28 */public class AppManager {private static Stack<Activity> activityStack;private static AppManager instance;private AppManager() {}/** * 单一实例 */public static AppManager getAppManager() {if (instance == null) {instance = new AppManager();}return instance;}/** * 添加Activity到堆栈 */public void addActivity(Activity activity) {if (activityStack == null) {activityStack = new Stack<Activity>();}activityStack.add(activity);}/** * 获取当前Activity(堆栈中最后一个压入的) */public Activity currentActivity() {Activity activity = activityStack.lastElement();return activity;}/** * 结束当前Activity(堆栈中最后一个压入的) */public void finishActivity() {Activity activity = activityStack.lastElement();finishActivity(activity);}/** * 结束指定的Activity */public void finishActivity(Activity activity) {if (activity != null) {activityStack.remove(activity);activity.finish();activity = null;}}/** * 结束指定类名的Activity */public void finishActivity(Class<?> cls) {for (Activity activity : activityStack) {if (activity.getClass().equals(cls)) {finishActivity(activity);}}}/** * 结束所有Activity */public void finishAllActivity() {for (int i = 0, size = activityStack.size(); i < size; i++) {if (null != activityStack.get(i)) {activityStack.get(i).finish();}}activityStack.clear();}/** * 退出应用程序 */public void AppExit(Context context) {try {finishAllActivity();ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);activityMgr.restartPackage(context.getPackageName());System.exit(0);} catch (Exception e) {}}}
ApiClient
package net.driver.app.api;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.util.HashMap;import java.util.Map;import net.driver.app.AppContext;import net.driver.app.AppException;import net.driver.app.base.Result;import net.driver.app.bean.URLs;import org.apache.commons.httpclient.Cookie;import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;import org.apache.commons.httpclient.Header;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpException;import org.apache.commons.httpclient.HttpStatus;import org.apache.commons.httpclient.cookie.CookiePolicy;import org.apache.commons.httpclient.methods.GetMethod;import org.apache.commons.httpclient.methods.PostMethod;import org.apache.commons.httpclient.methods.multipart.FilePart;import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;import org.apache.commons.httpclient.methods.multipart.Part;import org.apache.commons.httpclient.methods.multipart.StringPart;import org.apache.commons.httpclient.params.HttpMethodParams;import android.os.StrictMode;public class ApiClient {public static final String UTF_8 = "UTF-8";public static final String DESC = "descend";public static final String ASC = "ascend";private final static int TIMEOUT_CONNECTION = 20000; // 设置请求超时20秒钟private final static int TIMEOUT_SOCKET = 20000; // // 设置等待数据超时时间20秒钟private final static int RETRY_TIME = 3;private static String appCookie;private static String appUserAgent;static Header[] headers; // 头文件数组static { init(); // 判断版本格式,如果版本>2.3,就用相应的程序进行处理,以便不影响访问网络}public static void cleanCookie() {appCookie = "";}private static String getCookie(AppContext appContext) {if(appCookie == null || appCookie == "") {appCookie = appContext.getProperty("cookie");}return appCookie;}private static String getUserAgent(AppContext appContext) {if(appUserAgent == null || appUserAgent == "") {StringBuilder ua = new StringBuilder("CallTaxi.NET");ua.append('/'+appContext.getPackageInfo().versionName+'_'+appContext.getPackageInfo().versionCode);//App版本ua.append("/Android");//手机系统平台ua.append("/"+android.os.Build.VERSION.RELEASE);//手机系统版本ua.append("/"+android.os.Build.MODEL); //手机型号ua.append("/"+appContext.getAppId());//客户端唯一标识appUserAgent = ua.toString();}return appUserAgent;}private static HttpClient getHttpClient() { HttpClient httpClient = new HttpClient();// 设置 HttpClient 接收 Cookie,用与浏览器一样的策略httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); // 设置 默认的超时重试处理策略httpClient.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());// 设置 连接超时时间httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(TIMEOUT_CONNECTION);// 设置 读数据超时时间 httpClient.getHttpConnectionManager().getParams().setSoTimeout(TIMEOUT_SOCKET);// 设置 字符集httpClient.getParams().setContentCharset(UTF_8);return httpClient;}// get方法private static GetMethod getHttpGet(String url, String cookie, String userAgent) {GetMethod httpGet = new GetMethod(url);// 设置 请求超时时间httpGet.getParams().setSoTimeout(TIMEOUT_SOCKET);httpGet.setRequestHeader("Host", URLs.HOST);httpGet.setRequestHeader("Connection","Keep-Alive");httpGet.setRequestHeader("Cookie", cookie);httpGet.setRequestHeader("User-Agent", userAgent);return httpGet;}// post方法private static PostMethod getHttpPost(String url, String cookie, String userAgent) {PostMethod httpPost = new PostMethod(url);// 设置 请求超时时间httpPost.getParams().setSoTimeout(TIMEOUT_SOCKET);httpPost.setRequestHeader("Host", URLs.HOST);httpPost.setRequestHeader("Connection","Keep-Alive");httpPost.setRequestHeader("Cookie", cookie);httpPost.setRequestHeader("User-Agent", userAgent);return httpPost;}/** * get请求URL * @param url * @throws AppException */private static String http_get(AppContext appContext, String url) throws AppException {String cookie = getCookie(appContext);String userAgent = getUserAgent(appContext);HttpClient httpClient = null;GetMethod httpGet = null;String responseBody = "";int time = 0;do{try {httpClient = getHttpClient();httpGet = getHttpGet(url, cookie, userAgent);int statusCode = httpClient.executeMethod(httpGet);if (statusCode != HttpStatus.SC_OK) {throw AppException.http(statusCode);}responseBody = httpGet.getResponseBodyAsString();break;} catch (HttpException e) {time++;if(time < RETRY_TIME) {try {Thread.sleep(1000);} catch (InterruptedException e1) {} continue;}// 发生致命的异常,可能是协议不对或者返回的内容有问题e.printStackTrace();throw AppException.http(e);} catch (IOException e) {time++;if(time < RETRY_TIME) {try {Thread.sleep(1000);} catch (InterruptedException e1) {} continue;}// 发生网络异常e.printStackTrace();throw AppException.network(e);} finally {// 释放连接httpGet.releaseConnection();httpClient = null;}}while(time < RETRY_TIME);responseBody = responseBody.replaceAll("\\p{Cntrl}", "");try {Result res = GsonRequestUtils.gson.fromJson(responseBody, Result.class);if(res.getResultCode() == Result.UNKNOW){appContext.Logout();//appContext.getUnLoginHandler().sendEmptyMessage(1);}} catch (Exception e) {e.printStackTrace();}return responseBody;}/** * 公用post方法 * @param url * @param params * @param files * @throws AppException */private static String _post(AppContext appContext, String url, Map<String, Object> params, Map<String,File> files) throws AppException {//System.out.println("post_url==> "+url);String cookie = getCookie(appContext);String userAgent = getUserAgent(appContext);HttpClient httpClient = null;PostMethod httpPost = null;//post表单参数处理int length = (params == null ? 0 : params.size()) + (files == null ? 0 : files.size());Part[] parts = new Part[length];int i = 0; if(params != null) for(String name : params.keySet()){ parts[i++] = new StringPart(name, String.valueOf(params.get(name)), UTF_8); //System.out.println("post_key==> "+name+" value==>"+String.valueOf(params.get(name))); } if(files != null) for(String file : files.keySet()){ try {parts[i++] = new FilePart(file, files.get(file));} catch (FileNotFoundException e) {e.printStackTrace();} //System.out.println("post_key_file==> "+file); }String responseBody = "";int time = 0;do{try {httpClient = getHttpClient();httpPost = getHttpPost(url, cookie, userAgent); httpPost.setRequestEntity(new MultipartRequestEntity(parts,httpPost.getParams())); int statusCode = httpClient.executeMethod(httpPost); if(statusCode != HttpStatus.SC_OK) { throw AppException.http(statusCode); } else if(statusCode == HttpStatus.SC_OK) { Cookie[] cookies = httpClient.getState().getCookies(); String tmpcookies = ""; for (Cookie ck : cookies) { tmpcookies += ck.toString()+";"; } //保存cookie if(appContext != null && tmpcookies != ""){ appContext.setProperty("cookie", tmpcookies); appCookie = tmpcookies; } } responseBody = httpPost.getResponseBodyAsString(); //System.out.println("XMLDATA=====>"+responseBody); break; } catch (HttpException e) {time++;if(time < RETRY_TIME) {try {Thread.sleep(1000);} catch (InterruptedException e1) {} continue;}// 发生致命的异常,可能是协议不对或者返回的内容有问题e.printStackTrace();throw AppException.http(e);} catch (IOException e) {time++;if(time < RETRY_TIME) {try {Thread.sleep(1000);} catch (InterruptedException e1) {} continue;}// 发生网络异常e.printStackTrace();throw AppException.network(e);} finally {// 释放连接httpPost.releaseConnection();httpClient = null;}}while(time < RETRY_TIME); //if(responseBody.contains("result") && responseBody.contains("errorCode") && appContext.containsProperty("user.uid")){//try {//Result res = Result.parse(new ByteArrayInputStream(responseBody.getBytes()));//if(res.getErrorCode() == 0){//appContext.Logout();//appContext.getUnLoginHandler().sendEmptyMessage(1);//}//} catch (Exception e) {//e.printStackTrace();//}//} return responseBody;}/** * post请求URL * @param appContext * @param url * @param params * @param files * @return json对象 * @throws AppException * @throws IOException */private static String http_post(AppContext appContext, String url, Map<String, Object> params, Map<String,File> files) throws AppException, IOException { return _post(appContext, url, params, files); }private static String _MakeURL(String p_url, Map<String, Object> params) {StringBuilder url = new StringBuilder(p_url);if(url.indexOf("?")<0)url.append('?');for(String name : params.keySet()){url.append('&');url.append(name);url.append('=');url.append(String.valueOf(params.get(name)));//不做URLEncoder处理//url.append(URLEncoder.encode(String.valueOf(params.get(name)), UTF_8));}return url.toString().replace("?&", "?");} // 判断版本格式,如果版本 > 2.3,就是用相应的程序进行处理,以便影响访问网络 private static void init() { String strVer = android.os.Build.VERSION.RELEASE; // 获得当前系统版本 strVer = strVer.substring(0, 3).trim(); // 截取前3个字符 2.3.3转换成2.3 float fv = Float.valueOf(strVer); if (fv > 2.3) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() .build()); } } // -------------------------------------- public static String addFavorite(AppContext appContext) throws AppException {Map<String,Object> params = new HashMap<String,Object>();params.put("mobileUserId", 3);System.out.println("" + URLs.FAVORITE_ADD + "?mobileUserId=3");try{return http_get(appContext, URLs.FAVORITE_ADD + "?mobileUserId=3");}catch(Exception e){if(e instanceof AppException)throw (AppException)e;throw AppException.network(e);}}}
GsonRequestUtils
package net.driver.app.api;import com.google.gson.Gson;import com.google.gson.GsonBuilder;/** * Gson请求帮助类 * @author Bert guo * date 2013-3-28 */public class GsonRequestUtils {public static Gson gson = null; // 声明gson对象static {gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); // 创建gson对象,并设置日期格式}}
HistoryParkItem
package net.driver.app.bean;import java.io.Serializable;import java.util.Date;public class HistoryParkItem implements Serializable {private int mobileUserId;private String carParkName;private String seatNo;private Date parkAt;private Date takenAt;private double amount;private String plateNo;private int carTakingRecordId;public int getMobileUserId() {return mobileUserId;}public void setMobileUserId(int mobileUserId) {this.mobileUserId = mobileUserId;}public String getCarParkName() {return carParkName;}public void setCarParkName(String carParkName) {this.carParkName = carParkName;}public String getSeatNo() {return seatNo;}public void setSeatNo(String seatNo) {this.seatNo = seatNo;}public Date getParkAt() {return parkAt;}public void setParkAt(Date parkAt) {this.parkAt = parkAt;}public Date getTakenAt() {return takenAt;}public void setTakenAt(Date takenAt) {this.takenAt = takenAt;}public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}public String getPlateNo() {return plateNo;}public void setPlateNo(String plateNo) {this.plateNo = plateNo;}public int getCarTakingRecordId() {return carTakingRecordId;}public void setCarTakingRecordId(int carTakingRecordId) {this.carTakingRecordId = carTakingRecordId;}}URLs
package net.driver.app.bean;import java.io.Serializable;/** * 接口URL实体类 * @author Bert Guo * 2013-3-27 */public class URLs implements Serializable {public final static String HOST = "192.168.1.1:8080";public final static String HTTP = "http://";public final static String HTTPS = "https://";private final static String URL_SPLITTER = "/";private final static String URL_UNDERLINE = "_";private final static String project = "/calltaxi";private final static String URL_PASSENGER = "passenger";private final static String URL_COOPERATION = "cooperation";private final static String URL_API_HOST = HTTP + HOST + URL_SPLITTER;public final static String FAVORITE_ADD = URL_API_HOST+"ipms-core/mobile!fetchHistoryParkItem";}
StringUtils
package net.driver.app.common;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.regex.Pattern;/** * 字符串操作工具包 * * @author Bert Guo * @version 1.0 * @created 2013-3-3 */public class StringUtils {private final static double EARTH_RADIUS = 6378137.0; // 地球半径private final static Pattern emailer = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");private final static SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm");private final static SimpleDateFormat dateFormater2 = new SimpleDateFormat("yyyy-MM-dd");/** * 将字符串转位日期类型 * * @param sdate * @return */public static Date toDate(String sdate) {try {return dateFormater.parse(sdate);} catch (ParseException e) {return null;}}/** * 以友好的方式显示时间 * * @param sdate * @return */public static String friendly_time(String sdate) {Date time = toDate(sdate);if (time == null) {return "Unknown";}String ftime = "";Calendar cal = Calendar.getInstance();// 判断是否是同一天String curDate = dateFormater2.format(cal.getTime());String paramDate = dateFormater2.format(time);if (curDate.equals(paramDate)) {int hour = (int) ((cal.getTimeInMillis() - time.getTime()) / 3600000);if (hour == 0)ftime = Math.max((cal.getTimeInMillis() - time.getTime()) / 60000, 1)+ "分钟前";elseftime = hour + "小时前";return ftime;}long lt = time.getTime() / 86400000;long ct = cal.getTimeInMillis() / 86400000;int days = (int) (ct - lt);if (days == 0) {int hour = (int) ((cal.getTimeInMillis() - time.getTime()) / 3600000);if (hour == 0)ftime = Math.max((cal.getTimeInMillis() - time.getTime()) / 60000, 1)+ "分钟前";elseftime = hour + "小时前";} else if (days == 1) {ftime = "昨天";} else if (days == 2) {ftime = "前天";} else if (days > 2 && days <= 10) {ftime = days + "天前";} else if (days > 10) {ftime = dateFormater2.format(time);}return ftime;}/** * 判断给定字符串时间是否为今日 * * @param sdate * @return boolean */public static boolean isToday(String sdate) {boolean b = false;Date time = toDate(sdate);Date today = new Date();if (time != null) {String nowDate = dateFormater2.format(today);String timeDate = dateFormater2.format(time);if (nowDate.equals(timeDate)) {b = true;}}return b;}/** * 判断给定字符串是否空白串。 空白串是指由空格、制表符、回车符、换行符组成的字符串 若输入字符串为null或空字符串,返回true * * @param input * @return boolean */public static boolean isEmpty(String input) {if (input == null || "".equals(input))return true;for (int i = 0; i < input.length(); i++) {char c = input.charAt(i);if (c != ' ' && c != '\t' && c != '\r' && c != '\n') {return false;}}return true;}/** * 判断是不是一个合法的电子邮件地址 * * @param email * @return */public static boolean isEmail(String email) {if (email == null || email.trim().length() == 0)return false;return emailer.matcher(email).matches();}/** * 字符串转整数 * * @param str * @param defValue * @return */public static int toInt(String str, int defValue) {try {return Integer.parseInt(str);} catch (Exception e) {}return defValue;}/** * 对象转整数 * * @param obj * @return 转换异常返回 0 */public static int toInt(Object obj) {if (obj == null)return 0;return toInt(obj.toString(), 0);}/** * 对象转整数 * * @param obj * @return 转换异常返回 0 */public static long toLong(String obj) {try {return Long.parseLong(obj);} catch (Exception e) {}return 0;}/** * 字符串转布尔值 * * @param b * @return 转换异常返回 false */public static boolean toBool(String b) {try {return Boolean.parseBoolean(b);} catch (Exception e) {}return false;}public static String FormatDate(Date d) {return dateFormater.format(d);}private static String formatDuring(long mss) {long days = mss / (1000 * 60 * 60 * 24);long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60);long seconds = (mss % (1000 * 60)) / 1000;return days + "天," + hours + "小时," + minutes + "分";}public static String formatDuring(Date begin, Date end) {return formatDuring(end.getTime() - begin.getTime());}/** * 获取单位弧度 * * @param d直径 * @return 单位弧度 */public static double rad(double d) {return d * Math.PI / 180.0;}// 根据经纬度计算2个距离之间的的距离public static double getDistance(double lat1, double lng1, double lat2,double lng2) {double radLat1 = rad(lat1);double radLat2 = rad(lat2);double a = radLat1 - radLat2;double b = rad(lng1) - rad(lng2);double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)+ Math.cos(radLat1) * Math.cos(radLat2)* Math.pow(Math.sin(b / 2), 2)));s = s * EARTH_RADIUS;s = Math.round(s * 10000) / 10000;return s;}}
UIHelper
package net.driver.app.common;import java.io.Serializable;import java.util.HashMap;import java.util.Set;import net.driver.app.AppManager;import net.driver.app.R;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Toast;/** * UI帮助类 * @author Bert Guo * 2013-2-26 */public class UIHelper {/** * 发送App异常崩溃报告 * @param cont * @param crashReport */public static void sendAppCrashReport(final Context cont, final String crashReport) {AlertDialog.Builder builder = new AlertDialog.Builder(cont);builder.setIcon(android.R.drawable.ic_dialog_info);builder.setTitle(R.string.app_error);builder.setMessage(R.string.app_error_message);builder.setPositiveButton(R.string.submit_report, new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {dialog.dismiss();//发送异常报告Intent i = new Intent(Intent.ACTION_SEND);//i.setType("text/plain"); //模拟器i.setType("message/rfc822") ; //真机i.putExtra(Intent.EXTRA_EMAIL, new String[]{"jxsmallmouse@163.com"});i.putExtra(Intent.EXTRA_SUBJECT,"开源中国Android客户端 - 错误报告");i.putExtra(Intent.EXTRA_TEXT,crashReport);cont.startActivity(Intent.createChooser(i, "发送错误报告"));//退出AppManager.getAppManager().AppExit(cont);}});builder.setNegativeButton(R.string.sure, new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {dialog.dismiss();//退出AppManager.getAppManager().AppExit(cont);}});builder.show();}/** * 跳转到下一个Activity * * @param 当前Activity * @param 跳转到的Activity */public static void Go(Context context, Class<?> cls) {Intent i1 = new Intent();i1.setClass(context, cls);context.startActivity(i1);}/** * 跳转到下一个Activity * * @param 当前Activity * @param 跳转到的Activity * @param 两个Activity之间的参数 */public static void Go(Context context, Class<?> cls, Bundle bundle) {Intent i1 = new Intent();if (null != bundle) {i1.putExtras(bundle);}i1.setClass(context, cls);context.startActivity(i1);}/** * 跳转 * * @param 当前Activity * @param 跳转到的Activity * @param 数据集合 */public static void Go(Context context, Class<?> cls,HashMap<String, Serializable> map) {Intent i1 = new Intent();if (null != map) {Set<String> keys = map.keySet();for (String key : keys) {i1.putExtra(key, map.get(key));}}i1.setClass(context, cls);context.startActivity(i1);}/** * 弹出Toast消息 * @param msg */public static void ToastMessage(Context cont,String msg) {Toast.makeText(cont, msg, Toast.LENGTH_SHORT).show();}public static void ToastMessage(Context cont,int msg) {Toast.makeText(cont, msg, Toast.LENGTH_SHORT).show();}public static void ToastMessage(Context cont,String msg,int time) {Toast.makeText(cont, msg, time).show();}/** * 点击返回监听事件 * @param activity * @return */public static View.OnClickListener finish(final Activity activity){return new View.OnClickListener() {public void onClick(View v) {activity.finish();}};}}
MainActivity
package net.driver.app.ui;import java.util.List;import net.driver.app.AppContext;import net.driver.app.AppException;import net.driver.app.R;import net.driver.app.api.ApiClient;import net.driver.app.api.GsonRequestUtils;import net.driver.app.base.BaseActivity;import net.driver.app.base.Result;import net.driver.app.bean.HistoryParkItem;import android.os.Bundle;import com.google.gson.reflect.TypeToken;public class MainActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main);AppContext app = AppContext.getInstance();try {String msg = ApiClient.addFavorite(app);System.out.println("~~~~" + msg);TypeToken<Result<List<HistoryParkItem>>> typeToken = new TypeToken<Result<List<HistoryParkItem>>>() {};System.out.println("$$$$" + GsonRequestUtils.gson);Result<List<HistoryParkItem>> obj = GsonRequestUtils.gson.fromJson(msg, typeToken.getType());System.out.println("!!!" + obj.getData());} catch (AppException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
后续再进行完善吧