关于广播的底层实现原理及效率

ITjavaman 2015-12-07 06:21:00
加精
需求是这样的,假设我现在需要每隔1分钟发送一条消息更新一个UI,实现的想法有以下两个,
(1)启动一个新的线程:里面用一个while死循环,循环一次我就发一次消息并让这个线程睡眠一分钟,
(2)调用广播(不是很熟悉)
问题如下:
广播的底层实现原理是怎样的,效率如何(可以以我上面的需求作为比较对象),希望各路大神可以给我详细解答一下,谢谢
...全文
2490 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序猿小刘 2016-01-13
  • 打赏
  • 举报
回复
使用Handle发延迟消息更新UI。
ITjavaman 2015-12-14
  • 打赏
  • 举报
回复
感谢各位大神的解答,虽然没能具体解决我的问题,但至少让我了解的更清晰了一点,知识面也有所扩展 另附建议:以后各位大大回答问题的时候先抓住问题的重点,没回答主要问题反倒把问题扯远了,也不要用什么万金油标准答案回答(自行百度),谢谢各位
大繁星星 2015-12-13
  • 打赏
  • 举报
回复
android 底层发送广播,自行百度
SouthMa 2015-12-13
  • 打赏
  • 举报
回复
建议 Handler postDelay 组合EventBUS
我叫小菜菜 2015-12-12
  • 打赏
  • 举报
回复
引用 23 楼 ITjavaman 的回复:
[quote=引用 22 楼 zhi_ai_yaya 的回复:] 是的。底层应该还是一对一的点对点通信,只是用队列和集合控制组而已。 这跟经典以太网的转发机制不一样~
模式应该是一样的吧?也就是说组播组包含的并不是什么socket,它类似于一个线程集合,包含的是一条一条的线程,这么说对么[/quote] socket是通信的套接字,应该说,tcp和udp网络数据交换都要使用socket。 而组播,只是一个消息队列和接收者队列,把消息发送到每个接收者即可。简单的话可以由一个线程先后发送给所有人;如果实时要求高的,可以多线程并行发送,甚至使用分布式系统和分布式消息队列。 对于实际应用,一般都是直接使用现有的库,不必自己封装socket(有必要的话才会耗费人力物力去封装专用库,比如游戏主程序等)。
业余草 2015-12-11
  • 打赏
  • 举报
回复
建议使用这一种 ScheduledExecutorService executorService = Executors.newScheduledThreadPool(size); 你说的第一种如果系统时间改变了等,你的TimerTask就会死掉 就是说要预防你的定时器死掉的问题,死掉后要不要重新再开一个
ITjavaman 2015-12-11
  • 打赏
  • 举报
回复
引用 25 楼 xmt1139057136 的回复:
使用什么技术都可以实现。但是你要注意的是,你的做法不能影响主线程。 就是说你更新界面UI的同时不能让界面卡住了
举个例子

       Timer timer = new Timer();  
       timer.schedule(new MyTask(), 1000, 1000);  
class MyTask extends TimerTask {  
  
    @Override  
    public void run() {  
        //向handler发送信息
    }  
  
}  
new Thread(){

			@Override
			public void run() {
				// TODO Auto-generated method stub
				super.run();
				while(true){
					try {
						sleep(1000);
                                                 //向handler发送信息
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
			 
		   }.run();
这两种方式哪种好?然后跟广播比较呢?哪种实现方式比较好?好在哪?
ITjavaman 2015-12-11
  • 打赏
  • 举报
回复
引用 25 楼 xmt1139057136 的回复:
使用什么技术都可以实现。但是你要注意的是,你的做法不能影响主线程。 就是说你更新界面UI的同时不能让界面卡住了
所以我才想知道底层,想知道哪种实现的方式较好
业余草 2015-12-11
  • 打赏
  • 举报
回复
使用什么技术都可以实现。但是你要注意的是,你的做法不能影响主线程。 就是说你更新界面UI的同时不能让界面卡住了
业余草 2015-12-11
  • 打赏
  • 举报
回复
是时候祭出当年的笔记了。。。。。。 6.Understand unicast and multicast, Classification of reliable multicast. (Chap 6) 了解单播和组播,可靠组播分类。 (第6章) (1) 组通信(组播):一组进程之间的IPC问题。 组播在即时消息、群件、在线会议、交互式远程学习、实时在线拍卖等应用中非常有用。也用于出于容错目的而进行的服务复制。 单播:数据从源进程(发送者)发送到某个目标进程(接收者)。 将消息发送到单个接收者。一对一通信。 组播:将消息发送到多个接收者。一对多通信。 组播组:一组进程形成一个组播组。 (2)基本组播API必须提供: ① 加入组播组(join) ② 离开组播组(leave) ③ 向组播组发送数据(send) ④ 接收发往组播组的组播消息(receive) (3)基本组播是无连接且不可靠的通信;在不可靠组播系统中,不能保证信息安全传递到每个参与者 (4)可靠组播系统保证发往组播组的每个消息被正确传递到每个参与者。可根据所支持的消息传递顺序对可靠组播进一步分类: ① 无序组播可将消息按任何顺序传递到每个参与者 ② FIFO组播保持发送者的发送顺序将消息传递到每个参与者 ③ 因果组播保持消息之间的因果关系(因果关系:Mi→Mj,传递性) ④ 原子组播按相同顺序将消息传递到所有成员 (5)IP组播地址使用D类地址和UDP端口的组合。D类IP地址由IANA管理和分配。组播应用可使用静态D类地址、运行时获得临时地址或任一未分配地址。 (6)Java的基本组播API提供不可靠组播。创建MulticastSocket时需指定端口号。可调用MulticastSocket的joinGroup和LeaveGroup来加入或离开特定组播组。send和receive方法可用来发送和接收组播数据报。类DatagramPacket也需要创建数据包。 (7)有一些支持可靠组播的程序包,包括JRM服务。 关键就是标红的4个API,使用一个定时器,定时发送/接收消息就行了。底层原理,基本都是用队列/集合实现的,比如发送完一个就从集合/队列中移除(可靠的话就需要收到接收方的回复确认消息再移除)。
ITjavaman 2015-12-11
  • 打赏
  • 举报
回复
引用 22 楼 zhi_ai_yaya 的回复:
是的。底层应该还是一对一的点对点通信,只是用队列和集合控制组而已。 这跟经典以太网的转发机制不一样~
模式应该是一样的吧?也就是说组播组包含的并不是什么socket,它类似于一个线程集合,包含的是一条一条的线程,这么说对么
我叫小菜菜 2015-12-11
  • 打赏
  • 举报
回复
引用 21 楼 ITjavaman 的回复:
[quote=引用 20 楼 zhi_ai_yaya 的回复:]
我打个比方,这种模式是不是类似于我实现一个实时通信,比如说是一个多人SOCKET通信,而这样的一个组播就类似一个集合,这个集合里面包含的就是许多条socket(每两个对象就一条,也就相当于组播组),以这样的方式实现 单发和群发[/quote] 是的。底层应该还是一对一的点对点通信,只是用队列和集合控制组而已。 这跟经典以太网的转发机制不一样~
ITjavaman 2015-12-11
  • 打赏
  • 举报
回复
引用 20 楼 zhi_ai_yaya 的回复:
是时候祭出当年的笔记了。。。。。。 6.Understand unicast and multicast, Classification of reliable multicast. (Chap 6) 了解单播和组播,可靠组播分类。 (第6章) (1) 组通信(组播):一组进程之间的IPC问题。 组播在即时消息、群件、在线会议、交互式远程学习、实时在线拍卖等应用中非常有用。也用于出于容错目的而进行的服务复制。 单播:数据从源进程(发送者)发送到某个目标进程(接收者)。 将消息发送到单个接收者。一对一通信。 组播:将消息发送到多个接收者。一对多通信。 组播组:一组进程形成一个组播组。 (2)基本组播API必须提供: ① 加入组播组(join) ② 离开组播组(leave) ③ 向组播组发送数据(send) ④ 接收发往组播组的组播消息(receive) (3)基本组播是无连接且不可靠的通信;在不可靠组播系统中,不能保证信息安全传递到每个参与者 (4)可靠组播系统保证发往组播组的每个消息被正确传递到每个参与者。可根据所支持的消息传递顺序对可靠组播进一步分类: ① 无序组播可将消息按任何顺序传递到每个参与者 ② FIFO组播保持发送者的发送顺序将消息传递到每个参与者 ③ 因果组播保持消息之间的因果关系(因果关系:Mi→Mj,传递性) ④ 原子组播按相同顺序将消息传递到所有成员 (5)IP组播地址使用D类地址和UDP端口的组合。D类IP地址由IANA管理和分配。组播应用可使用静态D类地址、运行时获得临时地址或任一未分配地址。 (6)Java的基本组播API提供不可靠组播。创建MulticastSocket时需指定端口号。可调用MulticastSocket的joinGroup和LeaveGroup来加入或离开特定组播组。send和receive方法可用来发送和接收组播数据报。类DatagramPacket也需要创建数据包。 (7)有一些支持可靠组播的程序包,包括JRM服务。 关键就是标红的4个API,使用一个定时器,定时发送/接收消息就行了。底层原理,基本都是用队列/集合实现的,比如发送完一个就从集合/队列中移除(可靠的话就需要收到接收方的回复确认消息再移除)。 应该有所了解了吧。。
我打个比方,这种模式是不是类似于我实现一个实时通信,比如说是一个多人SOCKET通信,而这样的一个组播就类似一个集合,这个集合里面包含的就是许多条socket(每两个对象就一条,也就相当于组播组),以这样的方式实现 单发和群发
我叫小菜菜 2015-12-10
  • 打赏
  • 举报
回复
是时候祭出当年的笔记了。。。。。。 6.Understand unicast and multicast, Classification of reliable multicast. (Chap 6) 了解单播和组播,可靠组播分类。 (第6章) (1) 组通信(组播):一组进程之间的IPC问题。 组播在即时消息、群件、在线会议、交互式远程学习、实时在线拍卖等应用中非常有用。也用于出于容错目的而进行的服务复制。 单播:数据从源进程(发送者)发送到某个目标进程(接收者)。 将消息发送到单个接收者。一对一通信。 组播:将消息发送到多个接收者。一对多通信。 组播组:一组进程形成一个组播组。 (2)基本组播API必须提供: ① 加入组播组(join) ② 离开组播组(leave) ③ 向组播组发送数据(send) ④ 接收发往组播组的组播消息(receive) (3)基本组播是无连接且不可靠的通信;在不可靠组播系统中,不能保证信息安全传递到每个参与者 (4)可靠组播系统保证发往组播组的每个消息被正确传递到每个参与者。可根据所支持的消息传递顺序对可靠组播进一步分类: ① 无序组播可将消息按任何顺序传递到每个参与者 ② FIFO组播保持发送者的发送顺序将消息传递到每个参与者 ③ 因果组播保持消息之间的因果关系(因果关系:Mi→Mj,传递性) ④ 原子组播按相同顺序将消息传递到所有成员 (5)IP组播地址使用D类地址和UDP端口的组合。D类IP地址由IANA管理和分配。组播应用可使用静态D类地址、运行时获得临时地址或任一未分配地址。 (6)Java的基本组播API提供不可靠组播。创建MulticastSocket时需指定端口号。可调用MulticastSocket的joinGroup和LeaveGroup来加入或离开特定组播组。send和receive方法可用来发送和接收组播数据报。类DatagramPacket也需要创建数据包。 (7)有一些支持可靠组播的程序包,包括JRM服务。 关键就是标红的4个API,使用一个定时器,定时发送/接收消息就行了。底层原理,基本都是用队列/集合实现的,比如发送完一个就从集合/队列中移除(可靠的话就需要收到接收方的回复确认消息再移除)。 应该有所了解了吧。。
ITjavaman 2015-12-09
  • 打赏
  • 举报
回复
引用 16 楼 xiaohuh421 的回复:
http://blog.csdn.net/thinkinwm/article/details/45112669 请参考这里.
3Q
引用 17 楼 assky124 的回复:
Android 是开源的,可以看源码 \android-sdk-windows\sources\android-19\android\content 底层的话应该也是用线程+循环,没研究,你可以自己看看
3Q
assky124 2015-12-09
  • 打赏
  • 举报
回复
Android 是开源的,可以看源码 \android-sdk-windows\sources\android-19\android\content 底层的话应该也是用线程+循环,没研究,你可以自己看看
xiaohuh421 2015-12-09
  • 打赏
  • 举报
回复
http://blog.csdn.net/thinkinwm/article/details/45112669 请参考这里.
ITjavaman 2015-12-09
  • 打赏
  • 举报
回复
引用 14 楼 pengjianan123 的回复:
有什么业务需要这个吗?
我只想挖底层,了解一下效率,问题应该写的很清楚吧
q1127690517 2015-12-09
  • 打赏
  • 举报
回复
学习了,很不错
sanxiaochengyu 2015-12-08
  • 打赏
  • 举报
回复
引用 9 楼 ITjavaman 的回复:
[quote=引用 8 楼 a87b01c14 的回复:] 。。。这个你用timer +timertask 就可以搞定了,不需要自己写线程控制睡眠 如果要在熄屏方式下也使用的话,就用alarmanager
我问题的重点不在实现方式上,这种实现方法我也想过,调用里面的 onTimeChanged的方法就行不用再调用timer, timer的方式其实跟启动一个新的线程差不多[/quote]、 你重点不是实现方式,是什么呢? 我还说可以用alarmanager,这个可以定时调用broadcast,Activity,或者service
加载更多回复(12)

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧