当前位置: 首页 > news >正文

网站开发的3个阶段中国中小企业网站建设现状

网站开发的3个阶段,中国中小企业网站建设现状,遵义网站开发的公司有哪些,深圳公司网站建设顾名思义#xff0c;AndroidEventBus是一个Android平台的事件总线框架#xff0c;它简化了Activity、Fragment、Service等组件之间的交互#xff0c;很大程度上降低了它们之间的耦合#xff0c;使我们的代码更加简洁#xff0c;耦合性更低#xff0c;提升了我们的代码质量…顾名思义AndroidEventBus是一个Android平台的事件总线框架它简化了Activity、Fragment、Service等组件之间的交互很大程度上降低了它们之间的耦合使我们的代码更加简洁耦合性更低提升了我们的代码质量。但它能做的却不仅限于这些。经过定制它能完成很多有意思的功能那么究竟该怎么做呢就让我们一起往下看吧。       不堪回首的痛 首先让我们先来看看这么一个场景你是否在开发的过程中遇到过从Activity-A跳转到Activity-B然后需要在Activity-B处理完某些工作之后回调Activity-A中的某个函数但Activity又不能手动创建对象来设置一个Listener的情况或者遇到在某个Service中更新Activity或Fragment中的界面等组件之间的交互问题……       一经思考你会发现Android中的Activity、Fragment、Service之间的交互是比较麻烦的可能我们第一想到的是使用广播接收器来在它们之间进行交互。如上文所说在Activity-B中发一个广播在Activity-A中注册一个广播接收器来接收该广播。但使用广播接收器稍显麻烦如果你要将一个实体类当作数据在组件之间传递那么该实体类还得实现序列化接口这个成本实在有点高如代码1所示。 class ActivityA extends Activity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ActivityA中注册广播接收器 registerReceiver(new BroadcastReceiver() { Override public void onReceive(Context context Intent intent) { User person intent.getParcelableExtra(user) ; } } new IntentFilter(my_action)) ; } // ...... } // ActivityB中发布广播 class ActivityB extends Activity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 发布广播 Intent intent new Intent(my_ action); intent.putExtra(user new User(mr.simple)) ; sendBroadcast(intent); } // ...... } // 实体类需要实现序列化 class User implements Parcelable { String name ; public User(String aName) { name aName ; } // 代码省略 Override public void writeToParcel(Parcel dest int flags) { dest.writeString(name); } } 是不是有很麻烦的感觉我们再来看一个示例在开发过程中我们经常要在子线程中做一些耗时操作然后将结果更新到UI线程除了AsyncTask之外Thread加Handler是我们经常用的手段。如代码2所示。class MyActivity extends Activity { Handler mHandler new Handler () { public void handleMessage(android.os.Message msg) { if ( msg.what 1 ) { User user (User)msg.obj ; // do sth } }; } ; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // code ...... new Thread( new Runnable() { public void run() { // do sth User newUser new User(simple) ; Message msg mHandler.obtainMessage() ; msg.what 1 ; msg.obj newUser ; mHandler.sendMessage(msg) ; } }).start(); } } 是不是依然相当麻烦当然你也可以使用AsyncTask来简化操作但AsyncTask的几个泛型参数让你的代码看起来并不那么简洁因此GitHub上出现了TinyTask、SimpleTask这些开源库来简化AsyncTask的使用。而这些使用AndroidEventBus都可以很好地解决 下面就让我们来领悟一下AndroidEventBus的强大魅力吧。 初见AndroidEventBus 使用AndroidEventBus简单概括只有三个步骤 将对象注册到AndroidEventBus中使用Subcriber标注订阅函数只能有一个参数通过post函数发布事件。 接下来就是注册订阅对象如代码3所示。 public class MainActivity extends Activity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 将对象注册到事件总线中 ****** 注意要在onDestory中进行注销 **** EventBus.getDefault().register(this); } Override protected void onDestroy() { super.onDestroy(); // ****** 不要忘了进行注销 **** EventBus.getDefault().unregister(this); } // 代码省略 } 在onCreate中注册之后MainActivity就可以添加订阅函数来接收消息了。需要注意的是在onDestory中需要将MainActivity从事件总线中注销。通过AndroidEventBus你可以去除Activity、Fragment、Service等组件的回调减少了耦合简化了代码。  事件订阅函数事件订阅需要使用Subscriber注解进行标识且订阅函数的参数必须为一个。事件总线凭借参数类型和Subscriber注解的tag值来标识订阅函数的唯一性。当用户发布事件时总线库会根据事件类型和tag来查找符合要求的订阅函数并且将这些订阅函数执行在对应的线程中。我们先来看看代码4的订阅函数示例。 public class MainActivity extends Activity { // 代码省略 Subcriber(tag csuicide) private void csuicideMyself(String msg) { // do sth finish(); } Subcriber(mode ThreadMode.MAIN) private void toastMsgFromEvent(String msg) { // do sth } Subcriber(tag async mode ThreadMode.ASYNC) private void executeAsync(final String msg) { // do sth } // 代码省略 } 在代码4中我们为MainActivity添加了以下三个订阅函数  csuicideMyself该订阅函数执行在主线程接收事件的类型为Stringtag为csuicide。当用户发布一个事件类型为String且tag为csuicide的事件时将会触发该方法。toastMsgFromEvent该订阅函数也是执行在主线程事件类型为String且tag为默认。当用户发布一个事件类型为String且tag为默认的事件时将会触发该方法。executeAsync该订阅函数也是执行在一个异步线程事件类型为String且tag为async。当用户发布一个事件类型为String且tag为async的事件时将会触发该方法。 从上述的描述中我们可以知道事件接收函数主要有两个约束事件类型和tag类似于Intent中的Action。添加tag是因为在事件类型一样时如果投递一个消息那么单纯以事件类型例如String作为投递依据那么多个参数为String的订阅函数将会被触发这极大地降低了灵活性。 发布事件参数1为事件类型无tagEventBus.getDefault().post这是一个执行在异步线程的事件参数2为tagtag的类型为String类似Intent的ActionEventBus.getDefault().post这是一个执行在异步线程的事件“async”。 发布事件时可以构造任意类型的事件如果没有tag则该参数可以省略。发布事件后AndroidEventBus会根据事件类型和tag到已注册的订阅对象中查找符合要求的订阅函数例如投递的第二个事件类型为String、tag为async那么在MainActivity中符合要求的订阅函数就是 Subcriber(tag async mode ThreadMode.ASYNC) private void executeAsync(final String msg) { // do sth } AndroidEventBus的ThreadMode 在上述代码中有一段代码是这样的 Subcriber(mode ThreadMode.MAIN) private void toastMsgFromEvent(String msg) { } 这个mode可是大有来头它指定这个事件接收函数执行在哪个线程中。具体有如下三个选项 ThreadMode.MAIN事件接收函数执行在UI线程ThreadMode.POST事件在哪个线程发布接收函数就执行在哪个线程ThreadMode.ASYNC事件执行在一个独立的异步线程中。 图1中事件接收函数就执行在异步线程。通过这几个线程模型我们就可以定制接收函数的执行线程。这样我们就可以使用AndroidEventBus做很多事了。比如发布一个事件在这个事件接收函数中进行耗时操作或下载图片、进行HTTP请求、I/O操作等以及替换Thread、AsyncTask等组件。不过AndroidEventBus的功能远不止于此下面我们就看看如何进行更高端的操作。 还可以怎么玩 退出应用的另类实现 在Android应用开发中有些情况下我们需要可以直接退出程序。但问题是回退栈中含有其他的Activity存在直接使用返回键并不能退出应用。此时我们常见的做法是再自定义一个Application子类在子类中维护一个Activity的列表然后在进入Activity时将Activity添加到列表中在Activity销毁之前将自己从Application子类的列表中移除。在需要退出应用时遍历Application子类的Activity列表然后调用每个Activity的finish函数。那我们看看AndroidEventBus怎么实现这个功能。如代码5所示。  public class CsuicideActivity extends Activity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 将对象注册到事件总线中 ****** 注意要在onDestory中进行注销 **** EventBus.getDefault().register(this); } Override protected void onDestroy() { super.onDestroy(); // ****** 不要忘了进行注销 **** EventBus.getDefault().unregister(this); } Subcriber(tag csuicide) private void csuicideMyself(String msg) { finish(); } } 代码5中我们定义一个CsuicideActivity在onCreate中注册该Activity对象在onDestroy中注销还添加了一个csuicideMyself的订阅函数。所有的Activity类可以继承自CsuicideActivity。当需要退出应用时直接发布一个类型为String、tag为csuicide的事件即可。这样所有的Activity就会触发csuicideMyself而该函数中又调用了finish方法因此所有的Activity都将退出通过这种方式就完成了应用退出。 自定义事件处理器 ( EventHandler ) AndroidEventBus在设计之初就考虑到了可扩展性主要可扩展的地方就是订阅函数的搜索策略具体可以调用EventBus.getDefualt().setMatchPolicy(MatchPolicy policy)来实现策略替换。另一个比较重要的扩展就是事件处理器EventHandler用户可以通过setter函数来设置三个事件处理器。如代码6所示。 /** * 设置执行在UI线程的事件处理器 * param handler UI线程事件处理器 */ public void setUIThreadEventHandler(EventHandler handler) { mDispatcher.mUIThreadEventHandler handler; } /** * 设置执行在post线程的事件处理器 * param handler 事件在哪个线程投递事件就执行在哪个线程的事件处理器 */ public void setPostThreadHandler(EventHandler handler) { mDispatcher.mPostThreadHandler handler; } /** * 设置执行在异步线程的事件处理器 * param handler 异步线程事件处理器 */ public void setAsyncEventHandler(EventHandler handler) { mDispatcher.mAsyncEventHandler handler; } EventHandler的接口定义如代码7所示只需实现handleEvent即可然后将该实现注入到EventBus即可。 /** * 事件处理接口处理事件的抽象 */ public interface EventHandler { /** * 处理事件 * param subscription 订阅对象 * param event 待处理的事件 */ void handleEvent(Subscription subscription Object event); } 默认有DefaultEventHandler、UIThreadEventHandler、AsyncEventHandler三个实现DefaultEventHandler事件在哪个线程发布就将事件接收函数执行在哪个线程 UIThreadEventHandler将事件接收函数执行在UI线程 AsyncEventHandler将事件接收函数执行在异步线程。 下面我们以自定义异步事件处理器也就是AsyncEventHandler通过实现EventHandler接口将事件处理函数执行在一个线程池中从而实现图片下载的功能。如代码8所示。 public class ThreadPoolHandler implements EventHandler { ExecutorService mExecutorService Executors.newFixedThreadPool(3); EventHandler mHandler new DefaultEventHandler(); Override public void handleEvent(final Subscription subscription final Object event) { mExecutorService.submit(new Runnable() { Override public void run() { mHandler.handleEvent(subscription event); } }); } } 然后通过如下代码将ThreadPoolEventHandler注入到EventBus中 // 自定义的异步事件处理器使用线程池 EventBus.getDefault().setAsyncEventHandler(new ThreadPoolHandler()); 再在订阅对象中添加代码9所示的订阅方法 Subcriber(tag download mode ThreadMode.ASYNC) private void downloadImage(final String imageUrl) { HttpURLConnection urlConnection null; try { final URL url new URL(imageUrl); urlConnection (HttpURLConnection) url.openConnection(); final Bitmap bmp BitmapFactory.decodeStream(urlConnection.getInputStream()); // 将Bitmap投递给ImageView之类的工作 } catch (IOException e) { } finally { if (urlConnection ! null) { urlConnection.disconnect(); } } } 最后当需要下载图片时通过post发布一个参数为String类型、tag为download的事件即可执行downloadImage函数这个函数将执行在线程池中我们的简易ImageLoader就这么实现了。图2、图3分别为图片下载中和图片下载完成的页面。 当然由于AndroidEventBus的高度定制化我们还可以通过AndroidEventBus来实现各种各样的功能它到底还能怎么玩我就不做过多的演示了开发者可以充分发挥自己的聪明才智和想象力。
http://www.pierceye.com/news/554346/

相关文章:

  • 深圳做网站佰达科技二十七易语言做网站源码
  • 水禾田网站建设公司南沙区做网站
  • 江西赣州网站上海企业服务云电话
  • 洱源网站建设品牌名字大全
  • 网站建设阶段要做什么帝国cms对比WordPress
  • 盐城做企业网站多少钱网页设计个人总结800
  • 北京做兼职网站温州网站建设模板下载免费
  • 推进门户网站建设方案wordpress插件自动更新
  • 学院网站建设成效做网站需要什么功能
  • o2o手机网站建设技术网站设计师专业
  • 传媒网站建设方案wordpress开源博客系统最新版
  • 三合一网站一般多少钱浙江省和住房建设厅网站
  • 网站开发背景知识论文网页设计表格
  • 广州优秀网站建设怎么寻找国外客户资源
  • 松江新城投资建设集团有限公司网站华能电子商务平台
  • 网站建设设计制作公司微网站微商城
  • 长宁企业网站建设个人做外贸怎么做
  • 饲料 东莞网站建设免费推广app
  • 手机平台网站开发品牌网站设计首选
  • 哪些网站可以做调查赚钱图片生成软件
  • 网站空间的管理wordpress vip system
  • 新思维网站北京住房建设部网站首页
  • 温州网站制作套餐麒麟网站建设
  • 淘宝接单做网站wordpress能做企业网站吗
  • 网站建设运营公众号运营合同app网站开发书籍下载
  • 网站seo流程网站开发开账务处理
  • 婚介网站方案长沙网络公司电话
  • 自助网站搭建系统做网站接电话一般要会什么
  • 雷州网站建设公司网站建设与管理说课ppt
  • 问答类网站怎么做wordpress 调取页面缩略图