因为开源中国是使用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[]{"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 {
@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();
}
}
}
后续再进行完善吧