因为开源中国是使用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目录下的config File 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 @Override public void onCreate() { //注册App异常崩溃处理器 Thread.setDefaultUncaughtExceptionHandler(AppException.getAppExceptionHandler()); mInstance = this; initEngineManager(this); } @Override // 建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗 public void onTerminate() { // TODO Auto-generated method stub super.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; } @Override public void uncaughtException(Thread thread, Throwable ex) { // TODO Auto-generated method stub if(!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) + "分钟前"; else ftime = 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) + "分钟前"; else ftime = 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[]{"[email protected]"}); 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 { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.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 block e.printStackTrace(); } } }
后续再进行完善吧