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;
}
}
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) {
//执行点击后的操作
}
});
btn_login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//执行点击后的操作
}
});
1.4 实体化编程
fastJSON :
https://github.com/alibaba/fastjson
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();
}
}
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 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;
}
}
* 判断是否为空
*
* @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;
}
}