《app研發錄》第一章 重構,夜未眠筆記,ipd重構產品研發
1.1 重新規劃android的項目結構
重新規劃android的目錄結構分兩步:
1.建立AndroidLib類庫,將與業務無關的邏輯轉移到AndroidLib。
acitivity存放的是跟業務無關的Activity基類
cache包存放的是緩存數據和圖片相關的處理
net包存放的是網絡底層封裝
ui存放自定義控件
utils存放各種與業務無關的公共方法
2.將主項目中的類分門別類的進行劃分,放置各種包中。
activity 按模塊繼續劃分,將不同模塊的activity劃分到不同的包下
adapter放適配器
db 存放SQLite相關邏輯
engine存放業務相關的類
entity所以的實體存放
interfaces 接口 命名以I作為開頭
listener 基於Listener的接口 命名以On作為開頭
ui自定義控件
utils 所有的公共方法
這樣劃分的目的:
1.每個文件單獨一個類,不要有嵌套
2.將acitivity劃分後,可以迅速定位具體的頁面。開發人員都只負責自己的那個包,開發邊界很清晰。
1.2 為Activity定義新的生命周期
有一個原則,單一職責:一個類或方法,只做一件事。
觀察Activity的onCreate發現:
這段代碼包括三段邏輯:
1.初始化變量 initVariables
2.加載布局,初始化空間,為控件掛上事件方法。initView
3.獲取數據 loadData
可以在AndroidLib這個類庫中的BaseActivity重寫onCreate方法。
然後去繼承它實現它的三個方法。
1.3 統一事件編程模型
根據上面的
btn_login.setOnClickListener(this);
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_login:
//執行點擊後的操作
break;
}
}
每次還會使用R.id
所以比較推崇:
btn_login.setOnClickListener(this);
btn_login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//執行點擊後的操作
}
});
1.4 實體化編程
fastJSON : https://github.com/alibaba/fastjson
GSON: https://github.com/google/gson
fastJSON添加之後:
1:加了符號Annotation的實體屬性,使用就崩潰
2:有泛型屬性,使用就崩潰
調試的時候沒事打包簽名的時候就會出問題。
-keepattributes Signatue //避免混淆泛型
-keepattributes *Annotation* //不混淆注解
在頁面跳轉使用的實體:
1.調用請求的Json數據
2.從上一個頁面傳過來。
1.5 adapter模板:
public abstract class ListBaseAdapter<T> extends BaseAdapter{
protected Context mContext;
protected List<T> mValues;
protected LayoutInflater mInflater;
public ListBaseAdapter(Context context, List<T> values) {
mContext = context;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mValues = values;
}
public Context getContext() {
return mContext;
}
@Override
public int getCount() {
if (mValues != null)
return mValues.size();
return 0;
}
@Override
public T getItem(int position) {
if (position == getCount() - 1 || mValues == null) {
return null;
}
return mValues.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getItemView(convertView, position);
}
protected abstract View getItemView(View convertView, int position);
public void update(List<T> values) {
mValues = values;
notifyDataSetInvalidated();
notifyDataSetChanged();
}
}
1.6類型的安全轉換
/**
* 將字符轉換成數字
* @param value
* @param defaultValue
* @return
*/
public final static int convertToInt(String value,int defaultValue){
if(StringUtils.isNullOrEmpty(value)){
return defaultValue;
}
try {
return Integer.valueOf(value.toString());
} catch (Exception e) {
try {
return Double.valueOf(value.toString()).intValue();
} catch (Exception e1) {
return defaultValue;
}
}
}
/**
* 判斷是否為空
*
* @param text
* @return
*/
public static boolean isNullOrEmpty(String text) {
if (text == null || "".equals(text.trim()) || text.trim().length() == 0
|| "null".equals(text.trim())) {
return true;
} else {
return false;
}
}