今天我们E家课堂分享在android开发中比较常用的两个框架xutils和eventbus,这两个框架都可以在很大程度上提高生产力,但是这两个框架在使用上也有一些需要注意的地方。我们分别来介绍一下。首先是xutils,这是一个比较全面的框架,包括了视图绑定、orm数据库、网络请求等等。我们需要重点说明的是一下三点

视图绑定

@OnClick({ R.id.rl_login_submit, R.id.tv_quick_register,
			R.id.tv_forget_passwd, R.id.tv_tips })
	public void OnClick(View view) {
		switch (view.getId()) {
		case R.id.rl_login_submit:
			if (!checkData()) {
				return;
			}
	

需要注意一定是public的事件函数,只有这样才能避免在混淆的时候导致事件无法监听的情况发生,也就是点击事件无法响应。

orm数据库

一定要考虑数据库升级相关的东西,我这边有一个实例,要定义数据库的版本以及升级函数。

public DBUtils(Context context) {
		this.mContext = context;
		if (mContext != null) {
			DaoConfig config = new DaoConfig(context);
			config.setDbName(AppConfig.DBNAME); // db名
			config.setDbVersion(AppConfig.VERSION); // db版本
			dbUpgradeListener = new DbUpgradeListener() {

				@Override
				public void onUpgrade(DbUtils db, int oldVersion, int newVersion) {
					if (newVersion > oldVersion) {
//						updatexUtilsDBByClass(db, "super_message", "MessageBean");
						updateDb(db, "super_banner", "com.hnanet.supershiper.bean.querymodel.BannerModel");
						updateDb(db, "super_message", "com.hnanet.supershiper.bean.MessageBean");
					}

				}
			};
			config.setDbUpgradeListener(dbUpgradeListener);
			dbUtils = DbUtils.create(config);
			dbUtils.configAllowTransaction(true);
		} else {
			throw new RuntimeException("android context is null");
		}

	}

//升级数据库
/**
 * 升级数据库
 * @param <T>
 * @param db
 * @param tableName
 * @param className
 */
	private static <T> void updateDb(DbUtils db, String tableName, String className) {

		try {

			Class<T> c = (Class<T>) Class
					.forName( className);// 把要使用的类加载到内存中,并且把有关这个类的所有信息都存放到对象c中

			if (db.tableIsExist(c)) {

				List<String> dbFildsList = new ArrayList<String>();

				String str = "select * from " + tableName;

				Cursor cursor = db.execQuery(str);

				int count = cursor.getColumnCount();

				for (int i = 0; i < count; i++) {

					dbFildsList.add(cursor.getColumnName(i));

				}

				cursor.close();

				Field f[] = c.getDeclaredFields();// 把属性的信息提取出来,并且存放到field类的对象中,因为每个field的对象只能存放一个属性的信息所以要用数组去接收

				for (int i = 0; i < f.length; i++) {

					String fildName = f[i].getName();

					if (fildName.equals("serialVersionUID")) {

						continue;

					}

					String fildType = f[i].getType().toString();

					boolean flag = isExist(dbFildsList, fildName);
					if (!flag) {

						if (fildType.equals("class java.lang.String")) {

							db.execNonQuery("alter table " + tableName
									+ " add " + fildName + " TEXT ");

						} else if (fildType.equals("int")
								|| fildType.equals("long")
								|| fildType.equals("boolean")) {

							db.execNonQuery("alter table " + tableName
									+ " add " + fildName + " INTEGER ");

						}

					}

				}

			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

网络请求

可以设定重试的请求次数,同时在活动的ondestroy中要使用

handler.removeCallbacksAndMessages(null);

去掉回调,避免由于handler和activity的生命周期不同出现内存泄露的问题。

然后我们介绍一下eventbus,这是一个通用的观察者模式的框架和ios中的通知中心一样,我们可以通过eventbus实现不同界面之间的数据传递。

首先我们声明一个管理器类 EventBusManager

package com.hnanet.supershiper.app;

import de.greenrobot.event.EventBus;


/**
 * 
* @ClassName: EventBusManager 
* @Description: 事件监听管理器
* @author dotcoolgirl
* @date 2015-6-2 下午10:17:06 
*
 */
public class EventBusManager {

    private static final EventBus EVENT_BUS = EventBus.getDefault();

    public static void post(Object event) {
        EVENT_BUS.post(event);
    }

    public static void register(Object subscriber) {
        EVENT_BUS.register(subscriber);
    }

    public static void unregister(Object subscriber) {
        EVENT_BUS.unregister(subscriber);
    }
}

然后我们在需要响应事件的活动中使用


@Override
protected void initView() {
		setContentView(R.layout.message_list_layout);
		mContext = this;
		ViewUtils.inject(this);
        //注册到观察者中
		EventBusManager.register(this);

	}

@Override
	protected void onDestroy() {
        //取消注册
		EventBusManager.unregister(this);
		super.onDestroy();
	}
	public void onEventMainThread(final MessageEvent event) {
		//接收到消息事件,做出相关的处理
	}

在事件发出的地方只需要 

EventBusManager.postEvent(new MessageEvent());

轻松实现事件和数据的传递。

详情请看我们的视频教程