小編給大家分享一下Android中如何使用json實現(xiàn)服務(wù)器與客戶端數(shù)據(jù)的交互功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
十余年的澗西網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整澗西建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“澗西網(wǎng)站設(shè)計”,“澗西網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
具體如下:
第一步:寫一個遠程查詢工具類,使用單例模式
/** * 查詢遠程服務(wù)器的工具 * */ 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; } /** * 請求服務(wù)器得到返回值 * * @param keyword * @return * @throws Exception */ public String queryServer(String keyword, String reqType, String servlet) throws Exception { String returnValue = null; // 使用Map封裝請求參數(shù) 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; } } /** * 請求遠程服務(wù)器,并封裝參數(shù)信息 * @param url * @param rawParams * @return * @throws Exception */ public static String postRequest(String url, Map<String, String> rawParams) throws Exception { // 創(chuàng)建HttpPost對象。 HttpPost post = new HttpPost(url); // 如果傳遞參數(shù)個數(shù)比較多的話可以對傳遞的參數(shù)進行封裝 List<NameValuePair> params = new ArrayList<NameValuePair>(); for (String key : rawParams.keySet()) { // 封裝請求參數(shù) params.add(new BasicNameValuePair(key, rawParams.get(key))); } //Logger.i(TAG, "params------------------->" + params); // 設(shè)置請求參數(shù) post.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); HttpParams httpParameters = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParameters, 3000); HttpConnectionParams.setSoTimeout(httpParameters, 15000); DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); // 發(fā)送POST請求 HttpResponse httpResponse = httpClient.execute(post); // 如果服務(wù)器成功地返回響應(yīng) String result = null; if (httpResponse.getStatusLine().getStatusCode() == 200) { // 獲取服務(wù)器響應(yīng)字符串 result = EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); Logger.i(TAG, "result-------->" + result); } return result; }
第二步:使用軟引用把遠程得到的數(shù)據(jù)緩存到手機,如果服務(wù)器有數(shù)據(jù)更新,重新查詢
/** * 使用這個需要注意,一切都必須與服務(wù)器上的字段一一對應(yīng),大小寫一致 為了保持一致,所有的實體都必須小寫,遠程數(shù)據(jù)庫上的字段也得小寫 * * @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 reqType, String servlet) throws Exception { List<T> list = null; // 一旦創(chuàng)建過,重用 // 判斷是否創(chuàng)建了——曾經(jīng)創(chuàng)建過的界面需要存儲 if (LISTCACHE != null && LISTCACHE.containsKey(key)) { // 創(chuàng)建了,重用 list = (List<T>) LISTCACHE.get(key); if (list == null || list.isEmpty()) { // 有時候查詢 的數(shù)據(jù)過大,viewcache中放置不了那么多數(shù)據(jù),就會被垃圾回收站回收,得重新查詢遠程數(shù)據(jù)庫 list = getListFromServer(clazz, key, reqType, servlet); LISTCACHE.put(key, list); } } else { // 否則,創(chuàng)建 list = getListFromServer(clazz, key, reqType, servlet); LISTCACHE.put(key, list); } return list; } public <T> List<T> getListFromServer(Class<T> clazz, String keyword, String reqType, String servlet) throws Exception { List<T> list = new ArrayList<T>(); String returnValue = queryUtils.queryServer(keyword, reqType, 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; // 循環(huán)記錄數(shù)(多少條) 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 key, String reqType, String servlet) throws Exception { T t = null; // 一旦創(chuàng)建過,重用 // 判斷是否創(chuàng)建了——曾經(jīng)創(chuàng)建過的界面需要存儲 if (DOCCACHE != null && DOCCACHE.containsKey(key)) { // 創(chuàng)建了,重用 t = (T) DOCCACHE.get(key); if (t == null) { // 有時候查詢 的數(shù)據(jù)過大,viewcache中放置不了那么多數(shù)據(jù),就會被垃圾回收站回收,得重新查詢遠程數(shù)據(jù)庫 t = getDocFromServer(clazz, key, reqType, servlet); DOCCACHE.put(key, t); } } else { // 否則,創(chuàng)建 t = getDocFromServer(clazz, key, reqType, servlet); DOCCACHE.put(key, t); } return t; } public <T> T getDocFromServer(Class<T> clazz, String keyword, String reqType, String servlet) throws Exception { String returnValue = queryUtils.queryServer(keyword, reqType, servlet); if (!TextUtils.isEmpty(returnValue)) { Gson gson = new Gson(); T t = gson.fromJson(returnValue, clazz); return t; } return null; } /** * 查詢判斷客戶是否已經(jīng)添加 * * @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; } /** * 更新服務(wù)器上的數(shù)據(jù) * @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格式數(shù)據(jù)有誤!", Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { Toast.makeText(context, "網(wǎng)絡(luò)錯誤!錯誤信息:" + 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; @Override protected 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); } @Override public 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;// 聯(lián)系人 private String idcontact;// 聯(lián)系人id private String emtype;// 客戶分類 private String xsly;// 客戶來源 private String xsbh;// 線索編號 private String xs;// 線索名稱 private String idlead;// 線索id private String leadscode; private String idzh;// 相關(guān)展會 private String srcpath;// 來源途徑 private String emindustry;// 行業(yè) private String idarea; // 行政區(qū)域 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 sname, String scode, 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(); } }
第四步:服務(wù)器端 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, HttpServletResponse response) throws ServletException, 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); /** * 根據(jù)關(guān)鍵字查詢服務(wù)單 */ if (reqType != null && "queryAccountByKey".equalsIgnoreCase(reqType)) { // 根據(jù)查詢關(guān)鍵字查找對應(yīng)用戶列表 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); // 輸出響應(yīng) out.println(json.toString()); out.flush(); } } catch (Exception ex) { System.out.println("queryAccountByKey error:" + ex.getMessage()); } } } @Override public String getServletInfo() { return "Short description"; } }
第五步:查詢數(shù)據(jù)庫
@Stateless public 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("開始調(diào)用 " + 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 + "方法執(zhí)行完畢用時 " + 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 "//聯(lián)系人 + " 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; } }
以上是“Android中如何使用json實現(xiàn)服務(wù)器與客戶端數(shù)據(jù)的交互功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章標題:Android中如何使用json實現(xiàn)服務(wù)器與客戶端數(shù)據(jù)的交互功能
鏈接URL:http://m.newbst.com/article30/jesipo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、小程序開發(fā)、定制網(wǎng)站、服務(wù)器托管、企業(yè)網(wǎng)站制作、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)