Android 多线程实现重复启动与停止的服务
Android 多线程实现重复启动与停止的服务
多线程环境下为了避免死锁,一般提倡开放调用,开放调用可以避免死锁,它的代价是失去原子性。但是在有些时候会显得逻辑错误,
例如:
class A{ private boolean mIsStarted; void start(){ boolean changed = false; synchronized(this){ if(!mIsStarted){ mIsStarted = true; changed = false; } if(changed){ callBack.onStart(); } } } boolean isStarted(){ sychronized(this){ return mIstarted; } } void stop(){ boolean changed = false; synchronized(this){ if(mStarted){ mStarted = false; changed = true; } } if(changed){ callBack.onStop(); } } }
在单线程环境下这个代码没有任何问题。可是在多线程环境就会出现奇怪的现象。
原则上讲, onStart 一定要走在onStop前面,可事实并非如此:
执行步骤如下:
线程1 start
线程2 stop
线程1
if(!mIsStarted){ mIsStarted = true; changed = false; }
线程2
synchronized(this){ if(mStarted){ mStarted = false; changed = true; } }
线程2 onStop
线程1 onStart
现在onStop 走在了onStart前面。那么问题来了,如何才能保证onStart 一定在onStop前面呢?
那么问题又来了,stop 方法为什么不允许在start之前调用呢?如果一个类不可restart,那么stop是可以在start之前的,否则是不可以在start之前的。
以上就是Android 多线程实现重复启动与停止的服务的讲解,如有疑问请留言或者到本站社区交流讨论,感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关推荐
-
android实现多线程下载文件(支持暂停、取消、断点续传)
多线程下载文件(支持暂停.取消.断点续传) 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来即可. 涉及的知识及问题 请求的数据如何分段 分段完成后如何下载和下载完成后如何组装到一起 暂停下载和继续下载的实现(wait().notifyAll().synchronized的使用) 取消下载和断点续传的实现 一.请求的数据如何分段 首先通过HttpURLConne
-
Android的HTTP多线程下载示例代码
本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 多线程断点需要的功能 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度. 多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 RandomAccessFile file = new RandomAccessFile("QQWubiSetup.exe",&q
-
Android多线程断点续传下载功能实现代码
原理 其实断点续传的原理很简单,从字面上理解,所谓断点续传就是从停止的地方重新下载. 断点:线程停止的位置. 续传:从停止的位置重新下载. 用代码解析就是: 断点:当前线程已经下载完成的数据长度. 续传:向服务器请求上次线程停止位置之后的数据. 原理知道了,功能实现起来也简单.每当线程停止时就把已下载的数据长度写入记录文件,当重新下载时,从记录文件读取已经下载了的长度.而这个长度就是所需要的断点. 续传的实现也简单,可以通过设置网络请求参数,请求服务器从指定的位置开始读取数据. 而要实现这两个功
-
Android FTP 多线程断点续传下载\上传的实例
最近在给我的开源下载框架Aria增加FTP断点续传下载和上传功能,在此过程中,爬了FTP的不少坑,终于将功能实现了,在此把一些核心功能点记录下载. FTP下载原理 FTP单线程断点续传 FTP和传统的HTTP协议有所不同,由于FTP没有所谓的头文件,因此我们不能像HTTP那样通过设置header向服务器指定下载区间. 但是FTP协议提供了一个更好用的命令REST用于从指定位置恢复任务,同时FTP协议也提供了一个命令SIZE用于获取下载的文件大小,有了这两个命令,FTP断点续传也就没有什么问题.
-
Android实现网络多线程断点续传下载实例
我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度.那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 RandomAccessFile file = new RandomAc
-
Android多线程学习实例详解
本文实例分析了Android多线程.分享给大家供大家参考,具体如下: 在Android下面也有多线程的概念,在C/C++中,子线程可以是一个函数,一般都是一个带有循环的函数,来处理某些数据,优先线程只是一个复 杂的运算过程,所以可能不需要while循环,运算完成,函数结束,线程就销毁.对于那些需要控制的线程,一般我们都是和互斥锁相互关联,从而来控制线程 的进度,一般我们创建子线程,一种线程是很常见的,那就是带有消息循环的线程. 消息循环是一个很有用的线程方式,曾经自己用C在Linux下面实现一个
-
Android多线程之同步锁的使用
本文主要介绍了Android多线程之同步锁的使用,分享给大家,具体如下: 一.同步机制关键字synchronized 对于Java来说,最常用的同步机制就是synchronized关键字,他是一种基于语言的粗略锁,能够作用于对象.函数.class.每个对象都只有一个锁,谁能够拿到这个锁谁就有访问权限.当synchronized作用于函数时,实际上锁的也是对象,锁定的对象就是该函数所在类的对象.而synchronized作用于class时则是锁的这个Class类,并非具体对象. public cl
-
Android多线程+单线程+断点续传+进度条显示下载功能
效果图 白话分析: 多线程:肯定是多个线程咯 断点:线程停止下载的位置 续传:线程从停止下载的位置上继续下载,直到完成任务为止. 核心分析: 断点: 当前线程已经下载的数据长度 续传: 向服务器请求上次线程停止下载位置的数据 con.setRequestProperty("Range", "bytes=" + start + "-" + end); 分配线程: int currentPartSize = fileSize / mThreadNum
-
Android 多线程实现重复启动与停止的服务
Android 多线程实现重复启动与停止的服务 多线程环境下为了避免死锁,一般提倡开放调用,开放调用可以避免死锁,它的代价是失去原子性.但是在有些时候会显得逻辑错误, 例如: class A{ private boolean mIsStarted; void start(){ boolean changed = false; synchronized(this){ if(!mIsStarted){ mIsStarted = true; changed = false; } if(changed)
-
C#启动和停止windows服务的实例代码
复制代码 代码如下: <script type="text/javascript"> function showLoading(desc) { $("body").append("<div id=\"processingdiv\" style=\"display:none;\"><div class=\"popup\"> &l
-
使用批处理实现启动和停止服务的代码分析(net start&net stop)
使用windows自带的net.exe功能启动或停止服务 启动/停止 服务的命令行格式为: net start / stop服务名称 (注意:服务先要设置为手动启动类型) 例子: 以启动和停止Oracle11g服务为例(ORCL是数据库名 ): 复制代码 代码如下: %启动Oracle的服务% @echo.服务启动...... @echo off net start OracleVssWriterORCL net start OracleDBConsoleorcl net start Oracl
-
C#对Windows服务组的启动与停止操作
Windows服务大家都不陌生,Windows服务组的概念,貌似MS并没有这个说法. 作为一名软件开发者,我们的机器上安装有各种开发工具,伴随着各种相关服务. Visual Studio可以不打开,SqlServer Management Studio可以不打开,但是SqlServer服务却默认开启了.下班后,我的计算机想用于生活.娱乐,不需要数据库服务这些东西,尤其是在安装了Oracle数据库后,我感觉机器吃力的很. 每次开机后去依次关闭服务,或者设置手动开启模式,每次工作使用时依次去开启服务
-
android 多线程技术应用
多线程案例--计时器 这个案例中,屏幕启动之后,进入如图所示的界面. 屏幕上有一个文本框用于显示逝去的时间,此外还有一个"停止计时"按钮.案例的用例图如图所示. 能够在屏幕上"实时地显示"时间的流逝,单线程程序是无法实现的,必须要多线程程序才可以实现,即便有些计算机语言可以通过封装好的类实现这一功能,但从本质上讲这些封装好的类就是封装了一个线程. 综上所述,完成本案例用到的知识及技术如下: 1)进程和线程的概念; 2)Java中的线程,在Java中创建线程的方式;
-
android Service基础(启动服务与绑定服务)
Service是Android中一个类,它是Android 四大组件之一,使用Service可以在后台执行耗时的操作(注意需另启子线程),其中Service并不与用户产生UI交互.其他的应用组件可以启动Service,即便用户切换了其他应用,启动的Service仍可在后台运行.一个组件可以与Service绑定并与之交互,甚至是跨进程通信.通常情况下Service可以在后台执行网络请求.播放音乐.执行文件读写操作或者与contentprovider交互等. 本文主要讲述service
-
Android 应用程序的启动流程示例详解
目录 应用进程的启动流程 1.ActivityStackSupervisor.startSpecificActivity 2.ATMS.startProcessAsync 3.LocalService.startProcess 4.startProcessLocked函数 5.ProcessList.startProcessLocked 6.ProcessList.startProcessLocked重载 7.ProcessList.startProcess 8.ZygoteState.star
-
Android 多线程的实现方法总结
Android 多线程的实例详解 Java多线程方式 1. 继承Thread线程,实现run方法 2. 实现Runnable接口 JAVA单继承性,当我们想将一个已经继承了其他类的子类放到Thread中时,单继承的局限就体现出来了 但是可以实现多个接口,所以第二种方法相对于第一种来说灵活许多 其次,通过 new Thread(Runnable runnable).start() 启动线程的方式,若变量在runnable中定义,多个线程可以共用,因为来自同一个对象 比较适合多个相同程序代码的线程去
-
Android编程中activity启动时出现白屏、黑屏问题的解决方法
本文实例讲述了Android编程中activity启动时出现白屏.黑屏问题的解决方法.分享给大家供大家参考,具体如下: 默认情况下 activity 启动的时候先把屏幕刷成白色,再绘制界面,绘制界面或多或少有点延迟,这段时间中你看到的就是白屏,显然影响用户体验,怎么消除呢? 在 Activity theme 设置style 即可 <style name="AppTheme" parent="android:Theme.Light.NoTitleBar">
随机推荐
- Spring获取ApplicationContext对象工具类的实现方法
- Angular2 http jsonp的实例详解
- ExtJS PropertyGrid中使用Combobox选择值问题
- Java实现迅雷地址转成普通地址实例代码
- 全面解析iOS应用中自定义UITableViewCell的方法
- php实现在站点里面添加邮件发送的功能
- python字典键值对的添加和遍历方法
- JSP 中使用cache取值出错解决办法
- php调用c++的方法
- JavaScript运行时库属性一览表
- Linux shell中的printf的详细用法
- ASP.NET防止页面刷新的两种解决方法小结
- TSYS资源特性的效率提高方法
- Lua中关系运算符的使用教程
- 批处理实现文本内容横列变纵列的代码
- Android实现从activity中停止Service的方法
- Javascript学习笔记7 原型链的原理
- javascript Firefox与IE 替换节点的方法
- C语言之没有main函数的helloworld示例
- SpringMVC KindEditor在线编辑器之文件上传代码实例