一、ViewUtils
你受夠了重複冗長的findViewById了嘛?你受夠了各種監聽事件的綁定了嘛?在這裏,你只需要一句註解,如@ViewInject、@OnClick,就能輕鬆擺脫小白似的代碼,大大的上了一個檔次。
二、HttpUtils
支持的HTTP七種請求方式,非常便捷的滿足你的接口請求的需要。同時還支持大文件上傳下載,以及同步異步請求。
三、BitmapUtils
你的程序因OOM強制關閉過嘛?你在爲加在網絡圖片頭疼嘛?有了組件,你將永久擺脫前面的問題。
四、DbUtils
簡單易用又出色的ORM框架,真的是誰用誰知道,直接輕鬆存儲各種對象到sqlite數據庫中,同時也能非常方便的進行各種條件查詢,甚至分頁查詢,還有對錶中數據的更新刪除等操作,真正的實現。一行代碼就可以進行增刪改查。並且可通過註解自定義表名,列名,外鍵,唯一性約束,NOT NULL約束,CHECK約束等,支持事務。
由於xUtils是基於aFinal的,這個開源框架是國內的某位大神寫的,所以瞭解了aFinal之後再回頭看xUtils,纔會更有收穫。同時,也要向這位大神以及衆多的開源貢獻者致敬,有了他們的奉獻和開源的精神,才涌現出一個個耳熟能詳的更加優秀的更加穩定的框架。我們衆所周知的Linux就是這麼誕生的。
aFinal學習地址:http://www.afinal.org
先來看一看ViewUtils的代碼:
//綁定佈局文件
@ContentView(R.layout.activity_main)
public class MainActivity extends Activity {
//綁定btn1的id
@(R.id.Button01 )
private Button btn1 ;
@ViewInject(R.id.Button02 )
private Button btn2 ;
@ViewInject(R.id.button3 )
private Button btn3 ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//綁定對象
ViewUtils. inject(this);
}
//綁定按鈕的監聽器
@OnChildClick({ R.id.Button01, R.id.Button02, R.id. button3 })
private void onClick(View v) {
switch (v.getId()) {
case R.id.Button01 :
Toast. makeText(MainActivity.this, "Button1",Toast.LENGTH_SHORT).show();
break;
case R.id.Button02 :
Toast. makeText(MainActivity.this, "Button2",Toast.LENGTH_SHORT).show();
break;
case R.id.button3 :
startActivity( new Intent(MainActivity.this ,HttpActivity.class));
break;
default:
break;
}
}
}
二、HttpUtils
@ContentView(R.layout.activity_http)
public class HttpActivity extends ActionBarActivity {
@ViewInject(R.id.pregress)
private TextView pregress;
@ViewInject(R.id.post)
private Button post;
@ViewInject(R.id.download)
private Button downLoad;
@ViewInject(R.id.upload)
private Button upload;
HttpUtils httpUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewUtils.inject(this);
httpUtils = new HttpUtils();
loadData();
}
private void loadData() {
// 請求數據
httpUtils.send(HttpMethod.GET, "", new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = responseInfo.result;
System.out.println(result.toString());
}
@Override
public void onFailure(HttpException error, String msg) {
}
});
}
/**
* 下載數據
*
* @Title: downLoad
* @說 明:
* @參 數:
* @return void 返回類型
* @throws
*/
public void downLoad() {
String url = "https://github.com/wyouflf/xUtils/archive/master.zip";
HttpHandler<File> httpHandler = httpUtils.download(url, Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "master.zip",
new RequestCallBack<File>() {
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
System.out.println("");
}
@Override
public void onFailure(HttpException error, String msg) {
}
/**
* 第一個參數文件的長度 , 第二 當前下載的進度 第三 判斷是否是上傳還是下載
*/
@Override
public void onLoading(long total, long current, boolean isUploading) {
super.onLoading(total, current, isUploading);
pregress.setText(String.valueOf(current / total * 100));
}
});
httpHandler.cancel();
}
@OnClick({ R.id.upload })
public void onClickListener(View view) {
switch (view.getId()) {
case R.id.download:
downLoad();
break;
case R.id.post:
downLoad();
break;
case R.id.upload:
uploadFile();
break;
default:
break;
}
}
//上傳圖片到服務器(也可以上傳對象、String都可以)
public void uploadFile() {
String url = "http://10.2.108.35:8080/app/uplaodFile?method=upload";
RequestParams params = new RequestParams();
String path =FileUtils.getImagePath();
File file = new File(path);
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
params.addBodyParameter("" + i, files[i]);
}
httpUtils.send(HttpMethod.POST, url, params, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
System.out.println(responseInfo.result);
}
@Override
public void onFailure(HttpException error, String msg) {
System.out.println(msg);
}
});
}
/**
* 獲取提交的參數
*
* @Title: getParams
* @說 明:
* @參 數: @return
* @return List<NameValuePair> 返回類型
* @throws
*/
private List<NameValuePair> getParams() {
List<NameValuePair> list = new ArrayList<NameValuePair>();
NameValuePair userName = new BasicNameValuePair("name", "test");
list.add(userName);
NameValuePair pswNameValuePair = new BasicNameValuePair("psw", "123456");
list.add(pswNameValuePair);
return list;
}
}
第一:首先自定義application,初始化配置
public class BaseApplication extends Application {
***
* BitmpUtils BitmapGlobalConfig 配置緩存大小,儲存位置 大小
* BitmapdisplayConfig 配置圖片的大小
* 以及設置默認圖片,下載錯誤的圖片
*
*
*/
private BitmapGlobalConfig globalConfig;
private BitmapDisplayConfig displayConfig;
private static BaseApplication application;
@Override
public void onCreate() {
super.onCreate();
application = this;
configBitmapParams();
}
//得到這個類的對象
public static BaseApplication getApplication() {
return application;
}
public void configBitmapParams() {
/**
* 單利模式初始化,並設置緩存的路徑
*/
globalConfig = BitmapGlobalConfig.getInstance(this, FileUtils.getAppImageCache());
int cacheSize = (int) Runtime.getRuntime().maxMemory() / 8;
// 設置緩存大小
globalConfig.setMemoryCacheSize(cacheSize);
}
public BitmapGlobalConfig getGlobalConfig() {
return globalConfig;
}
public void setGlobalConfig(BitmapGlobalConfig globalConfig) {
this.globalConfig = globalConfig;
}
public BitmapDisplayConfig getDisplayConfig() {
return displayConfig;
}
public void setDisplayConfig(BitmapDisplayConfig displayConfig) {
this.displayConfig = displayConfig;
}
}
第二步:加載數據、通知adapter更新、在adapter裏面進行加載圖片
private void loadData() {
httpUtils.send(HttpMethod.GET, CommonURL.FRONT_IMAGE_TEST, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = responseInfo.result;
try {
JSONObject jsonObject = new JSONObject(result);
JSONArray jsonArray = jsonObject.getJSONArray("items");
if (jsonArray != null && jsonArray.length() > 0) {
for (int j = 0; j < jsonArray.length(); j++) {
Items items = Items.getFromJSON(jsonArray.getJSONObject(j));
list.add(items);
}
adapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(HttpException error, String msg) {
LogUtils.e(msg);
}
});
}
第三步
package com.qianfeng.bitmaputils.adapter;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.qianfeng.bitmaputils.R;
import com.qianfeng.bitmaputils.bean.Items;
public class MainAdapter extends AppBaseAdapter<Items> {
private BitmapUtils bitmapUtils;
public MainAdapter(List<Items> list, Context context) {
super(list, context);
}
public MainAdapter(List<Items> list, Context context, BitmapUtils bitmapUtils) {
this(list, context);
this.bitmapUtils = bitmapUtils;
}
@Override
public View createView(int position, View convertView) {
ViewHolder vh = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.fm_listview_item_layout, null);
vh = new ViewHolder();
ViewUtils.inject(vh, convertView);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}
vh.contentTv.setText(list.get(position).getContent());
vh.otherNameTv.setText(list.get(position).getLogin());
bitmapUtils.display(vh.headIv, list.get(position).getImage());
// bitmapUtils.display(container, uri, displayConfig, new ),這個方法裏面有個回調監聽器、可在這裏設置進度條相關東西
return convertView;
}
private static class ViewHolder {
@ViewInject(R.id.headIv)
ImageView headIv;
@ViewInject(R.id.otherName)
TextView otherNameTv;
@ViewInject(R.id.content)
private TextView contentTv;
}
}
XUtils混淆
第一:使用了ViewUtil的註解的監聽事件,訪問修飾符必須是public,否則混淆打包之後監聽無效。
第二:在proguard-project中加入: -libraryjars libs/xUtils-2.6.14.jar
-keep class com.lidroid.** { *; }