本文实例讲述了AndroID开发使用Json实现服务器与客户端数据的交互功能。分享给大家供大家参考,具体如下:
第一步:写一个远程查询工具类,使用单例模式
/** * 查询远程服务器的工具 * @author chen.lin * */public class queryUtils { //private static final String TAG = "CommonUtils"; private static queryUtils instance; private SharedPreferences sp; private queryUtils(Context context){ sp = context.getSharedPreferences(Constant.CONfig,Context.MODE_PRIVATE); } public static queryUtils getInstance(Context context){ if (instance == null) { synchronized (queryUtils.class) { if (instance == null) { instance = new queryUtils(context); } } } return instance; } /** * 请求服务器得到返回值 * * @param keyword * @return * @throws Exception */ public String queryServer(String keyword,String reqType,String servlet) throws Exception { String returnValue = null; // 使用Map封装请求参数 Map<String,String> map = new HashMap<String,String>(); map.put("reqType",reqType); map.put("localiP",sp.getString(Constant.NETIP,"")); if (!TextUtils.isEmpty(keyword)) { map.put("keyword",keyword); } String url = "http://" + sp.getString(Constant.NETURL,"") + "/ymerp/" + servlet; returnValue = postRequest(url,map); return returnValue; }}/*** 请求远程服务器,并封装参数信息* @param url* @param rawParams* @return* @throws Exception*/public static String postRequest(String url,Map<String,String> rawParams) throws Exception { // 创建httpPost对象。 httpPost post = new httpPost(url); // 如果传递参数个数比较多的话可以对传递的参数进行封装 List<nameValuePair> params = new ArrayList<nameValuePair>(); for (String key : rawParams.keySet()) { // 封装请求参数 params.add(new BasicnameValuePair(key,rawParams.get(key))); } //Logger.i(TAG,"params------------------->" + params); // 设置请求参数 post.setEntity(new UrlEncodedFormEntity(params,"UTF-8")); httpParams httpParameters = new BasichttpParams(); httpconnectionParams.setConnectionTimeout(httpParameters,3000); httpconnectionParams.setSoTimeout(httpParameters,15000); DefaulthttpClIEnt httpClIEnt = new DefaulthttpClIEnt(httpParameters); // 发送POST请求 httpResponse httpResponse = httpClIEnt.execute(post); // 如果服务器成功地返回响应 String result = null; if (httpResponse.getStatusline().getStatusCode() == 200) { // 获取服务器响应字符串 result = EntityUtils.toString(httpResponse.getEntity(),"UTF-8"); Logger.i(TAG,"result-------->" + result); } return result;}
第二步:使用软引用把远程得到的数据缓存到手机,如果服务器有数据更新,重新查询
/** * 使用这个需要注意,一切都必须与服务器上的字段一一对应,大小写一致 为了保持一致,所有的实体都必须小写,远程数据库上的字段也得小写 * * @author chen.lin * */@SuppressWarnings({ "unchecked","deprecation" })public class BaseManager { private static BaseManager instance; private queryUtils queryUtils; private SharedPreferences sp; private Context context; private BaseManager(Context context) { this.context = context; queryUtils = queryUtils.getInstance(context); sp = context.getSharedPreferences(Constant.CONfig,Context.MODE_PRIVATE); } public static BaseManager getInstance(Context context) { if (instance == null){ synchronized (BaseManager.class) { if (instance == null) { instance = new BaseManager(context); } } } return instance; } private static Map<String,List<?>> ListCACHE;// static { // 16M,如果不足<16M(模拟器) // 32M,真机 if (MemoryManager.hasAcailMemory()) { ListCACHE = new HashMap<String,List<?>>(); } else { ListCACHE = new SoftMap<String,List<?>>(); } } private static Map<String,Object> DOCCACHE;// static { // 16M,如果不足<16M(模拟器) // 32M,真机 if (MemoryManager.hasAcailMemory()) { DOCCACHE = new HashMap<String,Object>(); } else { DOCCACHE = new SoftMap<String,Object>(); } } public <T> List<T> queryListByCache(Class<T> clazz,String key,String servlet) throws Exception { List<T> List = null; // 一旦创建过,重用 // 判断是否创建了――曾经创建过的界面需要存储 if (ListCACHE != null && ListCACHE.containsKey(key)) { // 创建了,重用 List = (List<T>) ListCACHE.get(key); if (List == null || List.isEmpty()) { // 有时候查询 的数据过大,vIEwcache中放置不了那么多数据,就会被垃圾回收站回收,得重新查询远程数据库 List = getListFromServer(clazz,key,reqType,servlet); ListCACHE.put(key,List); } } else { // 否则,创建 List = getListFromServer(clazz,servlet); ListCACHE.put(key,List); } return List; } public <T> List<T> getListFromServer(Class<T> clazz,String keyword,String servlet) throws Exception { List<T> List = new ArrayList<T>(); String returnValue = queryUtils.queryServer(keyword,servlet); if (!TextUtils.isEmpty(returnValue)) { Gson gson = new Gson(); JsonParser JsonParser = new JsonParser(); JsonArray JsonArray = JsonParser.parse(returnValue).getAsJsonArray(); if (JsonArray != null) { T t = null; // 循环记录数(多少条) for (JsonElement Json : JsonArray) { if (Json != null) { t = gson.fromJson(Json,clazz); List.add(t); } } } } return List; } public <T> T queryDocByCache(Class<T> clazz,String servlet) throws Exception { T t = null; // 一旦创建过,重用 // 判断是否创建了――曾经创建过的界面需要存储 if (DOCCACHE != null && DOCCACHE.containsKey(key)) { // 创建了,重用 t = (T) DOCCACHE.get(key); if (t == null) { // 有时候查询 的数据过大,vIEwcache中放置不了那么多数据,就会被垃圾回收站回收,得重新查询远程数据库 t = getDocFromServer(clazz,servlet); DOCCACHE.put(key,t); } } else { // 否则,创建 t = getDocFromServer(clazz,servlet); DOCCACHE.put(key,t); } return t; } public <T> T getDocFromServer(Class<T> clazz,String servlet) throws Exception { String returnValue = queryUtils.queryServer(keyword,servlet); if (!TextUtils.isEmpty(returnValue)) { Gson gson = new Gson(); T t = gson.fromJson(returnValue,clazz); return t; } return null; } /** * 查询判断客户是否已经添加 * * @param keyword * @param dialog * @return * @throws Exception */ public boolean isAccountExist(String keyword) throws Exception { String returnValue = queryUtils.queryServer(keyword,"queryaccountExist","AccountdocumentServlet"); if (!TextUtils.isEmpty(returnValue) && "true".equals(returnValue.trim())) { return true; } return false; } /** * 更新服务器上的数据 * @param context * @param params * @param servlet * @return * @throws Exception */ public voID updateServer(final RequestParams params,String servlet) { AsynchttpClIEnt clIEnt = new AsynchttpClIEnt(); String url = "http://" + sp.getString(Constant.NETURL,"") + "/ymerp/" + servlet; clIEnt.post(url,params,new AsynchttpResponseHandler() { @OverrIDe public voID onSuccess(int statusCode,header[] headers,byte[] responseBody) { try { String returnValue = new String(responseBody); JsONObject JsonObject = new JsONObject(returnValue); if ("success".equalsIgnoreCase(JsonObject.getString("result"))) { if (params.has("sendread")) { Logger.i("update","更新成功!"); }else { Toast.makeText(context,"更新成功!",Toast.LENGTH_SHORT).show(); } }else { if (params.has("sendread")) { Logger.i("update","更新失败!"); }else { Toast.makeText(context,"更新失败!",Toast.LENGTH_SHORT).show(); } } } catch (JsONException e) { e.printstacktrace(); Toast.makeText(context,"Json格式数据有误!",Toast.LENGTH_SHORT).show(); } } @OverrIDe public voID onFailure(int statusCode,byte[] responseBody,Throwable error) { Toast.makeText(context,"网络错误!错误信息:" + error.getMessage(),Toast.LENGTH_SHORT).show(); } }); }}
第三步:使用事例-客户信息查询
public class SearchActivity extends CommonActivity implements OnClickListener {private BaseManager mManager;private ListVIEw mListVIEw ;private button mBtnquery;private queryAccountAdapter mAdapter;@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentVIEw(R.layout.search);// 初始化组件initVIEw();// 进出动画效果overrIDePendingTransition(R.anim.push_bottom_in,R.anim.push_bottom_out);}}private voID initVIEw() {mManager = BaseManager.getInstance(this);mListVIEw = (ListVIEw) findVIEwByID(R.ID.lv_search);mbutton = (button)findVIEwByID(R.ID.bt_query);mbutton.setonClickListener(this);mAdapter = new queryAccountAdapter(this,mAccounts);mListVIEw.setAdapter(mAdapter);}@OverrIDepublic voID onClick(VIEw v) {if(v == mBtnquery){mAccounts = mManager.getListFromServer(Account.class,query,"queryAccountByKey","queryServlet");}}}
客户实体类:
/** * 客户信息 * * @author chen.lin * @createtime 20150217 */public class Account implements Serializable { /** * */ private static final long serialVersionUID = 1L; private String ID; private String sname;// 客户名称 private String scode;// 客户编码 private String contact;// 联系人 private String IDcontact;// 联系人ID private String emtype;// 客户分类 private String xsly;// 客户来源 private String xsbh;// 线索编号 private String xs;// 线索名称 private String IDlead;// 线索ID private String leadscode; private String IDzh;// 相关展会 private String srcpath;// 来源途径 private String emindustry;// 行业 private String IDarea; // 行政区域 private String saddress;// 客户地址 private String shdz;// 收货地址 private String cclx;// 乘车路线 private String spostcode;// 邮编 private String stel;// 手机 private String telcode;// 电话号码 private String sfax;// 传真 private String semail;// 邮箱 private String swebsite;// 站点主页 private String IDdep;// 负责人部门 private String IDowner;// 负责人 private String created;// 新建时间 private String createdby;// 新建人 private String updated;// 编辑时间 private String updatedby;// 编辑人 public String getIDcontact() { return IDcontact; } public voID setIDcontact(String IDcontact) { this.IDcontact = IDcontact; } public String getContact() { return contact; } public voID setContact(String contact) { this.contact = contact; } public String getIDlead() { return IDlead; } public voID setIDlead(String IDlead) { this.IDlead = IDlead; } public String getLeadscode() { return leadscode; } public voID setLeadscode(String leadscode) { this.leadscode = leadscode; } public String getTelcode() { return telcode; } public voID setTelcode(String telcode) { this.telcode = telcode; } public String getID() { return ID; } public voID setID(String ID) { this.ID = ID; } public String getSname() { return sname; } public voID setSname(String sname) { this.sname = sname; } public String getScode() { return scode; } public voID setScode(String scode) { this.scode = scode; } public String getEmtype() { return emtype; } public voID setEmtype(String emtype) { this.emtype = emtype; } public String getXsly() { return xsly; } public voID setXsly(String xsly) { this.xsly = xsly; } public String getXsbh() { return xsbh; } public voID setXsbh(String xsbh) { this.xsbh = xsbh; } public String getXs() { return xs; } public voID setXs(String xs) { this.xs = xs; } public String getIDzh() { return IDzh; } public voID setIDzh(String IDzh) { this.IDzh = IDzh; } public String getSrcpath() { return srcpath; } public voID setSrcpath(String srcpath) { this.srcpath = srcpath; } public String getEmindustry() { return emindustry; } public voID setEmindustry(String emindustry) { this.emindustry = emindustry; } public String getIDarea() { return IDarea; } public voID setIDarea(String IDarea) { this.IDarea = IDarea; } public String getSaddress() { return saddress; } public voID setSaddress(String saddress) { this.saddress = saddress; } public String getShdz() { return shdz; } public voID setShdz(String shdz) { this.shdz = shdz; } public String getcclx() { return cclx; } public voID setcclx(String cclx) { this.cclx = cclx; } public String getSpostcode() { return spostcode; } public voID setSpostcode(String spostcode) { this.spostcode = spostcode; } public String getStel() { return stel; } public voID setStel(String stel) { this.stel = stel; } public String getSfax() { return sfax; } public voID setSfax(String sfax) { this.sfax = sfax; } public String getSemail() { return semail; } public voID setSemail(String semail) { this.semail = semail; } public String getSwebsite() { return swebsite; } public voID setSwebsite(String swebsite) { this.swebsite = swebsite; } public String getIDdep() { return IDdep; } public voID setIDdep(String IDdep) { this.IDdep = IDdep; } public String getIDowner() { return IDowner; } public voID setIDowner(String IDowner) { this.IDowner = IDowner; } public String getCreated() { return created; } public voID setCreated(String created) { this.created = created; } public String getCreatedby() { return createdby; } public voID setCreatedby(String createdby) { this.createdby = createdby; } public String getUpdated() { return updated; } public voID setUpdated(String updated) { this.updated = updated; } public String getUpdatedby() { return updatedby; } public voID setUpdatedby(String updatedby) { this.updatedby = updatedby; } public Account(String ID,String sname,String scode,String IDowner) { this.ID = ID; this.sname = sname; this.scode = scode; this.IDowner = IDowner; } public Account(String ID,String emtype,String xsly,String xsbh,String xs,String IDzh,String srcpath,String emindustry,String IDarea,String saddress,String shdz,String cclx,String spostcode,String stel,String sfax,String semail,String swebsite,String IDdep,String IDowner,String created,String createdby,String updated,String updatedby) { this.ID = ID; this.sname = sname; this.scode = scode; this.emtype = emtype; this.xsly = xsly; this.xsbh = xsbh; this.xs = xs; this.IDzh = IDzh; this.srcpath = srcpath; this.emindustry = emindustry; this.IDarea = IDarea; this.saddress = saddress; this.shdz = shdz; this.cclx = cclx; this.spostcode = spostcode; this.stel = stel; this.sfax = sfax; this.semail = semail; this.swebsite = swebsite; this.IDdep = IDdep; this.IDowner = IDowner; this.created = created; this.createdby = createdby; this.updated = updated; this.updatedby = updatedby; } public Account() { super(); }}
第四步:服务器端 queryAccountByKey就是从客户端传过来的值
/** * * @author chen.lin */public class queryServlet extends httpServlet { @OverrIDe protected voID doGet(httpServletRequest request,httpServletResponse response) throws servletexception,IOException { processRequest(request,response); } @OverrIDe protected voID doPost(httpServletRequest request,IOException { response.setContentType("text/HTML;charset=utf-8"); response.setCharacterEnCoding("UTF-8"); request.setCharacterEnCoding("UTF-8"); PrintWriter out = response.getWriter(); String reqType = request.getParameter("reqType"); String localiP = request.getParameter("localiP"); EJBClIEntLocal.setServerip(localiP); /** * 根据关键字查询服务单 */ if (reqType != null && "queryAccountByKey".equalsIgnoreCase(reqType)) { // 根据查询关键字查找对应用户列表 String keyword = request.getParameter("keyword"); System.out.println("keyword ----------------------:" + keyword); try { List<JsONObject> List = EJBClIEntLocal.getMetaCRMIntegratedSessionBeanLocal().queryAccountByKey(keyword); System.out.println(" queryAccountByKey List:" + List); if (List != null) { JsONArray Json = JsONArray.fromObject(List); // 输出响应 out.println(Json.toString()); out.flush(); } } catch (Exception ex) { System.out.println("queryAccountByKey error:" + ex.getMessage()); } } } @OverrIDe public String getServletInfo() { return "Short description"; }}
第五步:查询数据库
@Statelesspublic class MetaCRMIntegratedSessionBean implements MetaCRMIntegratedSessionBeanRemote,MetaCRMIntegratedSessionBeanLocal { @Resource SessionContext ctx; @PersistenceContext(unitname = "Meta_crm_ejbPU") private EntityManager em; private DBMsqlServer2005 dbm = null; private Statement statement = null; private PreparedStatement pStatement = null; SimpleDateFormat yyyymmdd = new SimpleDateFormat("yyyy-MM-dd"); @AroundInvoke public Object log(InvocationContext ctx) throws Exception { String classname = ctx.getTarget().getClass().getname(); String mothodname = ctx.getmethod().getname(); String target = classname + "." + mothodname + "()"; System.out.println("开始调用 " + target + "方法"); long start = System.currentTimeMillis(); try { Object localObject1 = ctx.proceed(); long time; return localObject1; } catch (Exception e) { return null; } finally { long time = System.currentTimeMillis() - start; System.out.print(target + "方法执行完毕用时 " + time + " ms"); } } /** * 查询客户信息 * @param keyword * @return */ public List<JsONObject> queryAccountByKey(String keyword) { List<JsONObject> List = new ArrayList<JsONObject>(); String sql = "select acc.ID,acc.sname,acc.scode," + " con.sname as contact,emp1.sname as createdby,acc.created,acc.saddress,con.ID " + " from account acc " + " left join org_employee emp1 on emp1.ID = acc.createdby "//申请人名称 + " left join contact con on acc.ID=con.IDaccount "//联系人 + " where 1=1 "; if (keyword != null) { System.out.println("keyword----------------------->" + keyword); sql += " and acc.sname like '%" + keyword + "%'"; sql += " or emp1.sname like '%" + keyword + "%'"; } sql += " order by acc.created desc"; System.out.println("sql----------------------->" + sql); Connection conn = getConn(); ResultSet rs = null; Statement st = null; try { st = conn.createStatement(); rs = st.executequery(sql); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); while (rs.next()) { JsONObject JsonObject = new JsONObject(); JsonObject.put("ID",rs.getobject(1) != null ? rs.getobject(1) : ""); JsonObject.put("sname",rs.getobject(2) != null ? rs.getobject(2) : ""); JsonObject.put("scode",rs.getobject(3) != null ? rs.getobject(3) : ""); JsonObject.put("contact",rs.getobject(4) != null ? rs.getobject(4) : ""); JsonObject.put("createdby",rs.getobject(5) != null ? rs.getobject(5) : ""); setTime(rs,sdf,JsonObject,"created",6); JsonObject.put("saddress",rs.getobject(7) != null ? rs.getobject(7) : ""); JsonObject.put("IDcontact",rs.getobject(8) != null ? rs.getobject(8) : ""); List.add(JsonObject); } } catch (sqlException ex) { ex.printstacktrace(); } finally { dbm.closeConn(); } return List; }}
PS:这里再为大家推荐几款比较实用的Json在线工具供大家参考使用:
在线JsON代码检验、检验、美化、格式化工具:
http://tools.jb51.net/code/json
JsON在线格式化工具:
http://tools.jb51.net/code/jsonformat
在线XML/JsON互相转换工具:
http://tools.jb51.net/code/xmljson
Json代码在线格式化/美化/压缩/编辑/转换工具:
http://tools.jb51.net/code/jsoncodeformat
C语言风格/HTML/CSS/Json代码格式化美化工具:
http://tools.jb51.net/code/ccode_html_css_json
更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android *** 作json格式数据技巧总结》、《Android数据库 *** 作技巧总结》、《Android编程之activity *** 作技巧总结》、《Android文件 *** 作技巧汇总》、《Android开发入门与进阶教程》、《Android资源 *** 作技巧汇总》、《Android视图View技巧总结》及《Android控件用法总结》
希望本文所述对大家AndroID程序设计有所帮助。
总结以上是内存溢出为你收集整理的Android开发使用json实现服务器与客户端数据的交互功能示例全部内容,希望文章能够帮你解决Android开发使用json实现服务器与客户端数据的交互功能示例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)