这篇文章将会对这三者做简单的综合性的比较,同时对LocalBroadCast深入到源码进行一个探索。看这个类为何相对BroadCast高效!

起航

1. 比较

  • 性能 对比 : EventBus不差

    EventBus ~ LocalBroadCast  > Bradocast 
    
  • 运行的线程环境: EventBus完胜!

    LocalBroadcastManager 所有调用都是在主线程,
    EventBus 可以定义在调用线程、主线程、后台线程、异步。

  • 代码量比较: EventBus完胜!

    Read more »

在做项目时候,有使用Ormlite来做数据库部分,以提高开发速度。

OrmLite - Lightweight Object Relational Mapping (ORM) Java Package

这个ORM框架在一般数据量不大的情况下,是一个很好的工具,他封装得很好,使用起来也很方便!
相比于原始的Sqlite来说,使用后,很容易回不去了,
因为你不再需要敲一堆的sql语句,担心那个字段写错,处理cursor,写各种查询等等!
重要的是在增加一些字段属性时候,不再需要改到哭了!

Read more »

在不同版本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

最后的一个大杀器就是直接写成模板。

Read more »

在解析前,我们先来看下一般我们使用的情况是怎样的
下面写了一个简单的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,有几点需要解决的问题。

  1. 为何他只能执行一次,再调用execute()就会出错

  2. doInBackground()是怎么做到在后台执行的

  3. 为何 onPreExecute(),onProgressUpdate()和onPostExecute()能运行在主线程

  4. 为何Task的实例必须在UI thread中创建,execute方法必须在UI thread中调用;

  5. 为何不能手动的调用onPreExecute(),onPostExecute(),doInBackground(),,onProgressUpdate()这几个方法;

带着这么几个问题,我们开始深入的看下AsyncTask的源代码。

Read more »