編輯:關於android開發
Android的展示數據,除了上章所講的本地存儲外,大部分數據都來自於網絡。首先介紹一下Android APP開發常見的網絡操作方式。從網絡層面上有底層的tcp/ip,也就是我們常見的socket套接字,常見於IM、消息推送等應用場景。另外常見的就是Http協議、webservice協議,常用於提供數據接口。常應用的數據格式有xml、json。其中最常見的也就是Http+Json的組合,這也是我們接下來要講解的重點。在這麼多項目的累計中,對於Http的訪問,我用過HttpUtil這樣的工具類,當然裡面封裝了簡單的get post方法。另外也用過volley這樣的集成框架。現在向大家推薦下我覺得最好用的一個框架就是AsyncHttpClient。先上一段簡單的示例代碼。
AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.google.com", new AsyncHttpResponseHandler() { @Override public void onStart() { // called before request is started } @Override public void onSuccess(int statusCode, Header[] headers, byte[] response) { // called when response HTTP status is "200 OK" } @Override public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) { // called when response HTTP status is "4XX" (eg. 401, 403, 404) } @Override public void onRetry(int retryNo) { // called when request is retried } }); 全在UI線程之外發生,而callback發生在創建它的線程中,應用了Android的Handler發送消息機制。你也可以把AsyncHttpClient應用在Service中或者後台線程中,庫代碼會自動識別出它所運行的context。github下載地址:https://github.com/loopj/android-async-http 。庫的size很小,所有的一切只有90kb,發送異步http請求,在匿名callback對象中處理response,http請求發生在UI線程之外,內部采用線程池來處理並發請求。詳細可以度娘一下。 另外一個就是Json的解析,當然有sdk裡面的JSONArray JsonObject,也用過gson的框架,這個過程中,用到最好用的就是阿裡巴巴的fastJosn。Base裡面集成了一個JsonUtil的工具類,可以快速實現對象 json等的相互轉化,直接上下代碼:public final class JsonUtil {到這裡大家是不是以為就結束了,當然不是,還能更easy。下節將介紹自己封裝的CustomAsyncHttpClient CustomAsyncResponehandler。將這兩個框架整合,先上一段代碼: 網絡操作的登陸方法:
private static String TAG = "FastJson";
public static boolean isSuccess(String jsonString) {
JSONObject json;
boolean flag = false;
try {
json = new JSONObject(jsonString);
flag = json.getBoolean("result");
} catch (JSONException e) {
e.printStackTrace();
}
return flag;
}
public static String getArrayString(String jsonString, String key) {
String value = "";
JSONObject json;
try {
json = new JSONObject(jsonString);
value = json.getJSONArray(key).toString();
} catch (JSONException e) {
e.printStackTrace();
}
return value;
}
public static String convertObjectToJson(Object o) {
SerializerFeature[] features = { SerializerFeature.QuoteFieldNames,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.WriteNullBooleanAsFalse,
SerializerFeature.WriteSlashAsSpecial,
SerializerFeature.BrowserCompatible,
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteDateUseDateFormat };
try {
Log.d(TAG, JSON.toJSONString(o, features));
return JSON.toJSONString(o, features);
} catch (Exception e) {
Log.e(TAG, e.toString());
return "";
}
}
public static <T> T convertJsonToObject(String json, Class<T> clazz) {
try {
return JSON.parseObject(json, clazz);
} catch (Exception e) {
Log.e(TAG, e.toString());
Log.e("merror", e.toString());
return null;
}
}
public static <T> List<T> convertJsonToList(String json, Class<T> clazz) {
try {
return JSON.parseArray(json, clazz);
} catch (Exception e) {
Log.e(TAG, e.toString());
System.out.println(e.toString());
return null;
}
}
}
public void login(final String userName, final String password, final CustomAsyncResponehandler handler) {
RequestModel requestModel = new RequestModel();
RequestParams params = new RequestParams();
params.put("userName", userName);
params.put("password", password);
requestModel.setParams(params);
requestModel.setCls(User.class);
requestModel.setShowErrorMessage(true);
requestModel.setUrl(Urls.userLogin);
httpClient.post(requestModel, new CustomAsyncResponehandler() {
@Override
public void onSuccess(ResponeModel baseModel) {
super.onSuccess(baseModel);
if (baseModel != null && baseModel.isStatus()) {
AppContext.currentUser = (User) baseModel.getResultObj();
AppContext.currentUser.setUserName(userName);
if (userDao != null) {
userDao.insert(AppContext.currentUser);
}
}
handler.onSuccess(baseModel);
}
});
}
在業務層都看不到json的解析代碼了,直接通過CustomAsyncHttpClient拿到目標對象進行操作,下節將詳細講解。
Android Studio中使用AIDL進行進程間通信 什麼是AIDL aidl是 Android Interface definition language的縮寫,也
Android制作粒子爆炸特效 簡介 最近在閒逛的時候,發現了一款粒子爆炸特效的控件,覺得比較有意思,效果也不錯。 但是代碼不好擴展,也就是說如果要提供不同的爆炸效果
android:Activity數據傳遞之全局對象(application) 在activity之間數據傳遞中還有一種比較實用的方式,就是全局對象applicatio
基於MVVM的知乎日報應用安卓源碼,mvvm日報安卓源碼使用data binding , dagger2 , retrofit2和rxjava實現的,基於MVVM的知乎日