公司网站建站要多少钱建筑设计常用软件

bicheng/2026/1/26 3:48:27/文章来源:
公司网站建站要多少钱,建筑设计常用软件,威海网站制作服务,企业运营公司顾名思义#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.mzph.cn/bicheng/86642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高校财务网站建设嘉峪关市网站建设设计

递增子序列 金牌导航 数据结构优化DP-1 题目大意 给出一个序列,让你求长度为m的单调递增子序列的个数 输入样例 3 2 1 1 2 7 3 1 7 3 5 9 4 8输出样例 2 12数据范围 1⩽n⩽104,1⩽m⩽100,0⩽ai⩽9876543211\leqslant n \leqslant 10^4,1\leqslant m \leqslant…

网站建设 标书丽水建设公司网站

优化分析是很多领域中都要面临的一个重要问题,求解优化问题的一般做法是:建立模型、编写算法、求解计算。常见的问题类型有线性规划、非线性规划、混合整数规划、混合整数非线性规划、二次规划等,优化算法包括人工智能算法和内点法等数学类优…

太原网站建设联系方式多备份wordpress

前言: 本文属于软件部分,具体的串口硬件部分可见http://t.csdnimg.cn/afh48,对于串口的工作原理以及各个寄存器工作流程的记录十分详细。 一、接线图 二、stm32发送-电脑串口助手接收 1.USART初始化流程图 1.开启时钟 把需要使用的USART和…

天津网站建设案例企业网站首页怎么优化

猫罐头要符合三点:营养配方完整均衡、原料新鲜优质、生产工艺科学可靠。只有具备这些特点,才是品质上乘的猫罐头。 这三个要点缺一不可,配方不够均衡营养,便无法给猫提供充足的营养、会导致营养不良;原料不够新鲜、优质…

网站界面设计起着决定性作用网站建设验收方发言稿

orm的理解我看过无数的文章和评论(尤其是评论),它们告诉我们ORM(对象关系映射)概念的严重性,糟糕性和错误性。 以下是通常的声明,以及我对它们的评论: “它们很慢” –映射有一些开销…

刷网站排名软件济南企业自助建站

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程 1 、安装GDB sudo apt-get install gdb 2 、怎么打断点 1 、源文件的某一行设置断点 break 行号 2、一个特定的函数设置断点 break 函数名 3、设置条件断点 break 行号 i…

wordpress毛玻璃主题优化网站排名公司

1.问题:官网BUG 本地做 yum 仓库,下载的文件,只有 23 版本的,其他的版本没有文件(版本23,占用2.1T后,一直不下载其它版本;) 2.解决方案: 2.1. rsync剔除不要的版本 [rootlocalh…

网站添加cms东莞常平火车站叫什么

PL/pgSQL是Vastbase提供的一种过程语言,在普通SQL语句的使用上增加了编程语言的特点,可以用于创建函数、存储过程、触发器过程以及创建匿名块等。 本文介绍Vastbase中PL/pgSQL的执行流程,包括PL/pgSQL的编译与运行。 1、编译 PL/pgSQL的编译…

家装类设计网站长沙市网站推广电话

如果全球影像每5天一更新,并集多种地图数据源于一体的PB级海量地图数据该怎样去管理呢? 这是当我了解到SOAR网站之后,思考过的一个问题。 全球最大的在线地图网站 在SOAR的官方网站,据称它是世界上最大的在线地图网站。 它是集…

南昌正规网站公司吗宁波建设监理管理协会网站

去年这个时候简单的摸索了一下三维的GIS相关的东西,也就是仅仅玩耍了一把,这次来点真正用的上的干货效果效果: 1、加载自定义百度样式的瓦片效果 2、加载自定义百度样式的缩放效果 3、快速手动进去咱的大帝都 4、加载海量Mark效果 5、加载海量Mark和简单模型效果 6、…

大家都用哪个网站做读书笔记临沂企业建站系统模板

项目编号: S 060 ,文末获取源码。 \color{red}{项目编号:S060,文末获取源码。} 项目编号:S060,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固…

最好的营销网站网页构建语言

1. 背景 网上搜了很多文章,总算有点头绪了。其实隐私清单最后做出来就是一个plist文件。找了几个常用三方已经配好的看了看,比着做就好了。 WWDC23 中关于隐私部分的更新(WWDC23 隐私更新官网),其中提到了第三方 SDK 的…

仿牌网站优化企业网站策划方案书

一、NetCDF介绍 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。NetCDF广泛应…

丹徒网站建设怎么样本地的赣州网站建设

SSL 证书(也称为公钥证书)是安装在 Web 服务器上的加密文件,可帮助建立安全、加密的在线通信,SSL 证书有两个主要用途: 提供加密:当访问者的浏览器通过SSL连接到您的网站时,信息交换是加密的&a…

网站开发与维修是什么意思用流媒体做的电台网站

SVG实现波浪效果 svg path:C 贝塞尔曲线绘制波浪形状 A 绘制圆弧形 svg animate:制作波浪动画,为了波浪动画效果自然,设置values关键点       attributeName:变化属性名 dur:动画时间 repeatCount&a…

网站建设在淘宝上以后让还让发布吗建筑工程类人才招聘

使用akshare可以很方便的获取同花顺行业列表,与每个行业对应的个股信息,流程如下: 使用ak.stock_board_industry_summary_ths()获取行业列表循环行业列表,使用ak.stock_board_industry_cons_ths()获取行业对应的个股信息 官方文…

给客户做网站建设方案企业邮箱怎么获取

目录 一、Chunk基本概念 1. Chunk的概念: 2. 配置Chunk: 3. Chunk的示例配置: 4. Chunk的执行流程:

什么网站做装修的推广引流的10大渠道

dataset库是Python中一个用于操作数据库的简单库,它提供了一种简洁的方式与各种关系型数据库进行交互,例如SQLite、MySQL、PostgreSQL 等。你可以使用dataset库来执行查询、插入、更新和删除操作,而无需编写复杂的SQL语句。dataset库适用于小…

济南网站制作平台电商主图模板

前言: 下面分享一些关于阿里,美团,深信服等公司的面经,供大家参考一下。大家也可以去收集一些其他的面试题,可以通过面试题来看看自己有哪里不足。也可以了解自己想去的公司会问什么问题,进行有针对的复习。…

网站开发费用包括美工费吗巴彦淖尔 网站建设

Every day a Leetcode 题目来源:2786. 访问数组中的位置使分数最大 解法1:动态规划 状态数组: dp[i][0]: 访问下标范围 [0, i] 中的元素且最后访问的元素是偶数时的最大得分;dp[i][1]: 访问下标范围 [0, i] 中的元素且最后访问…