欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開發(fā)使用json實現服務器與客戶端數據的交互功能示例

 更新時間:2017年10月30日 11:32:32   作者:lovoo  
這篇文章主要介紹了Android開發(fā)使用json實現服務器與客戶端數據的交互功能,結合具體實例形式分析了Android使用json格式數據在服務器與客戶端傳遞實現數據庫查詢功能的步驟與相關操作技巧,需要的朋友可以參考下

本文實例講述了Android開發(fā)使用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 {
    // 創(chuàng)建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);
    // 發(fā)送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 reqType, String servlet) throws Exception {
    List<T> list = null;
    // 一旦創(chuàng)建過,重用
    // 判斷是否創(chuàng)建了——曾經創(chuàng)建過的界面需要存儲
    if (LISTCACHE != null && LISTCACHE.containsKey(key)) {
      // 創(chuàng)建了,重用
      list = (List<T>) LISTCACHE.get(key);
      if (list == null || list.isEmpty()) {
        // 有時候查詢 的數據過大,viewcache中放置不了那么多數據,就會被垃圾回收站回收,得重新查詢遠程數據庫
        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)記錄數(多少條)
        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)建了——曾經創(chuàng)建過的界面需要存儲
    if (DOCCACHE != null && DOCCACHE.containsKey(key)) {
      // 創(chuàng)建了,重用
      t = (T) DOCCACHE.get(key);
      if (t == null) {
        // 有時候查詢 的數據過大,viewcache中放置不了那么多數據,就會被垃圾回收站回收,得重新查詢遠程數據庫
        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;
  }
  /**
   * 查詢判斷客戶是否已經添加
   *
   * @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, Header[] headers, 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;
@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;// 聯系人
  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;// 行業(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();
  }
}

第四步:服務器端 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);
    /**
     * 根據關鍵字查詢服務單
     */
    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";
  }
}

第五步:查詢數據庫

@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("開始調用 " + 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 "http://申請人名稱
        + " left join contact con on acc.id=con.idaccount "http://聯系人
        + " 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開發(fā)入門與進階教程》、《Android資源操作技巧匯總》、《Android視圖View技巧總結》及《Android控件用法總結

希望本文所述對大家Android程序設計有所幫助。

相關文章

  • Android實現圓形純數字按鈕

    Android實現圓形純數字按鈕

    這篇文章主要為大家詳細介紹了Android實現圓形純數字按鈕,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Android開發(fā)實現自定義Toast、LayoutInflater使用其他布局示例

    Android開發(fā)實現自定義Toast、LayoutInflater使用其他布局示例

    這篇文章主要介紹了Android開發(fā)實現自定義Toast、LayoutInflater使用其他布局,涉及Android自定義Toast與界面布局相關操作技巧,需要的朋友可以參考下
    2019-03-03
  • Android 簡易手勢密碼開源庫詳解

    Android 簡易手勢密碼開源庫詳解

    本文主要介紹Android 簡易手勢密碼,這里主要介紹手勢密碼如何實現及簡單的示例代碼,有需要的同學可以參考下
    2016-08-08
  • Android拼接實現動態(tài)對象方法詳解

    Android拼接實現動態(tài)對象方法詳解

    這篇文章主要為大家介紹了Android拼接實現動態(tài)對象方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Android開發(fā)ImageView圖片無法顯示解決過程

    Android開發(fā)ImageView圖片無法顯示解決過程

    在Android中ImageView無法顯示加載的本地SDCard圖片:過程為先調用本地照相機程序攝像,然后將拍攝的圖片加載在ImageView中顯示,具體解決方法如下,感興趣的朋友可以參考下哈
    2013-06-06
  • Android自定義ViewGroup實現九宮格布局

    Android自定義ViewGroup實現九宮格布局

    這篇文章主要為大家詳細介紹了Android如何通過自定義ViewGroup實現九宮格布局,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-12-12
  • Android使用vcard文件的方法簡單實例

    Android使用vcard文件的方法簡單實例

    這篇文章主要介紹了Android使用vcard文件的方法,結合實例形式分析了Android針對vcard文件的打開、讀取、寫入等相關操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • 解決android viewmodel 數據刷新異常的問題

    解決android viewmodel 數據刷新異常的問題

    這篇文章主要介紹了解決android viewmodel 數據刷新異常的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android簡潔的下拉放大刷新效果示例

    Android簡潔的下拉放大刷新效果示例

    本篇文章主要介紹了Android簡潔的下拉放大刷新效果示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Android編程之TextView的字符過濾功能分析

    Android編程之TextView的字符過濾功能分析

    這篇文章主要介紹了Android編程之TextView的字符過濾功能,結合實例形式分析了TextView控件實現字符過濾的相關技巧與使用方法,需要的朋友可以參考下
    2016-01-01

最新評論