这篇文章将会对这三者做简单的综合性的比较,同时对LocalBroadCast深入到源码进行一个探索。看这个类为何相对BroadCast高效!
起航
1. 比较
性能 对比 : EventBus不差
EventBus ~ LocalBroadCast > Bradocast
运行的线程环境: EventBus完胜!
LocalBroadcastManager 所有调用都是在主线程,
EventBus 可以定义在调用线程、主线程、后台线程、异步。代码量比较: EventBus完胜!
在做项目时候,有使用Ormlite来做数据库部分,以提高开发速度。
OrmLite - Lightweight Object Relational Mapping (ORM) Java Package
这个ORM框架在一般数据量不大的情况下,是一个很好的工具,他封装得很好,使用起来也很方便!
相比于原始的Sqlite
来说,使用后,很容易回不去了,
因为你不再需要敲一堆的sql语句,担心那个字段写错,处理cursor,写各种查询等等!
重要的是在增加一些字段属性时候,不再需要改到哭了!
在不同版本API,底层实现有些不一样,所以这里贴出现在在看的API版本号
API: 23
关于Activity的四个启动flag,这里下次再说。
先说下我们熟悉的一句吧
startActivity(new Intent(this,Test2Activity.class));
相信我们对这句太熟悉不过了,不过说到这里,我想说下关于写Intent的一个感觉好的实践
相信你已写腻了一堆这样的intent
,用起来确实很不好的,就像下面这样
Intent newIntent= new Intent(this,Test2Activity.class);
newIntent.putExtra("data1", "trialData1");
Bundle bundle=new Bundle();
bundle.putSerializable("key","trialData");
startActivity(newIntent);
像这种方式我在很多开源项目看到了很多这样的写法,这种不好的方式在于,很多我们要跳到同一个Activity里面去时候,重复写了,这很显然不适合DRY原则
,而且我们在另外一个Activity获取数据时候,也需要记住这些Key,这不太好!看到的另外一种方式就是直接写一个IntentUtil
类,里面写满各种Intent,感觉这种也不是很好!虽然没重复了,不过在获取数据方面还不是很好,还需要定义一些Constant数据,这里提供我个人觉得好的方式,在我们的Activity里面写一个静态的makeIntent()
函数。
如下:
public class Test2Activity extends AppCompatActivity {
public static final String EXTRA_DATA = "extra_data";
public static Intent makeIntent(Context mContext, String data) {
return new Intent(mContext, Test2Activity.class).putExtra(EXTRA_DATA, data);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test2);
//获取传过来的数据
String result = getIntent().getStringExtra(EXTRA_DATA);
}
}
之后我们需要调整到这个界面,只需要这么写
startActivity(Test2Activity.makeIntent(this,"data"));
通过这个静态方法,我们在数据里面读取方面都很简单,而且启动的时候也知道是要跳到那个界面去,重要是看起来很简单!而且不需要去定义一个常量类来记录这些数据的Key
最后的一个大杀器就是直接写成模板。
在解析前,我们先来看下一般我们使用的情况是怎样的
下面写了一个简单的demo,用来做个简单的任务,从1数到100,同时调用publishProgress(i);
来更新下进度。
我想用过的人自己直接阅读下面代码没有任何问题。
class MyDemoAsyncTask extends AsyncTask<Integer, Integer, String> {
private TextView textView;
private ProgressBar progressBar;
public MyDemoAsyncTask(TextView textView, ProgressBar progressBar) {
super();
this.textView = textView;
this.progressBar = progressBar;
}
@Override
protected void onPreExecute() {
textView.setText("开始执行异步线程");
}
@Override
protected String doInBackground(Integer... params) {
for (int i = 1; i <= 100; i += 1) {
publishProgress(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "resultString";
}
@Override
protected void onProgressUpdate(Integer... values) {
progressBar.setProgress(values[0]);
}
@Override
protected void onPostExecute(String result) {
textView.setText("异步操作执行结束" + result);
}
}
好了,这样一个demo,有几点需要解决的问题。
为何他只能执行一次,再调用execute()就会出错
doInBackground()是怎么做到在后台执行的
为何 onPreExecute(),onProgressUpdate()和onPostExecute()能运行在主线程
为何Task的实例必须在UI thread中创建,execute方法必须在UI thread中调用;
为何不能手动的调用onPreExecute(),onPostExecute(),doInBackground(),,onProgressUpdate()这几个方法;
带着这么几个问题,我们开始深入的看下AsyncTask的源代码。
开始学安卓的时候,我对一些异步操作都是用Handler和AsyncTask的。
现在那个Handler被挂上了泄漏的名字!
最近在设计一个功能的时候,像借鉴于handler的设计模式,所以顺便顺便写篇文章记录下。