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 多线程实现重复启动与停止的服务的讲解,如有疑问请留言或者到本站社区交流讨论,感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android多线程断点续传下载功能实现代码

    原理 其实断点续传的原理很简单,从字面上理解,所谓断点续传就是从停止的地方重新下载. 断点:线程停止的位置. 续传:从停止的位置重新下载. 用代码解析就是: 断点:当前线程已经下载完成的数据长度. 续传:向服务器请求上次线程停止位置之后的数据. 原理知道了,功能实现起来也简单.每当线程停止时就把已下载的数据长度写入记录文件,当重新下载时,从记录文件读取已经下载了的长度.而这个长度就是所需要的断点. 续传的实现也简单,可以通过设置网络请求参数,请求服务器从指定的位置开始读取数据. 而要实现这两个功

  • Android FTP 多线程断点续传下载\上传的实例

    最近在给我的开源下载框架Aria增加FTP断点续传下载和上传功能,在此过程中,爬了FTP的不少坑,终于将功能实现了,在此把一些核心功能点记录下载. FTP下载原理 FTP单线程断点续传 FTP和传统的HTTP协议有所不同,由于FTP没有所谓的头文件,因此我们不能像HTTP那样通过设置header向服务器指定下载区间. 但是FTP协议提供了一个更好用的命令REST用于从指定位置恢复任务,同时FTP协议也提供了一个命令SIZE用于获取下载的文件大小,有了这两个命令,FTP断点续传也就没有什么问题.

  • Android多线程+单线程+断点续传+进度条显示下载功能

    效果图 白话分析: 多线程:肯定是多个线程咯 断点:线程停止下载的位置 续传:线程从停止下载的位置上继续下载,直到完成任务为止. 核心分析: 断点: 当前线程已经下载的数据长度 续传: 向服务器请求上次线程停止下载位置的数据 con.setRequestProperty("Range", "bytes=" + start + "-" + end); 分配线程: int currentPartSize = fileSize / mThreadNum

  • android实现多线程下载文件(支持暂停、取消、断点续传)

    多线程下载文件(支持暂停.取消.断点续传) 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来即可. 涉及的知识及问题 请求的数据如何分段 分段完成后如何下载和下载完成后如何组装到一起 暂停下载和继续下载的实现(wait().notifyAll().synchronized的使用) 取消下载和断点续传的实现 一.请求的数据如何分段 首先通过HttpURLConne

  • Android实现网络多线程断点续传下载实例

    我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度.那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 RandomAccessFile file = new RandomAc

  • Android多线程之同步锁的使用

    本文主要介绍了Android多线程之同步锁的使用,分享给大家,具体如下: 一.同步机制关键字synchronized 对于Java来说,最常用的同步机制就是synchronized关键字,他是一种基于语言的粗略锁,能够作用于对象.函数.class.每个对象都只有一个锁,谁能够拿到这个锁谁就有访问权限.当synchronized作用于函数时,实际上锁的也是对象,锁定的对象就是该函数所在类的对象.而synchronized作用于class时则是锁的这个Class类,并非具体对象. public cl

  • Android多线程学习实例详解

    本文实例分析了Android多线程.分享给大家供大家参考,具体如下: 在Android下面也有多线程的概念,在C/C++中,子线程可以是一个函数,一般都是一个带有循环的函数,来处理某些数据,优先线程只是一个复 杂的运算过程,所以可能不需要while循环,运算完成,函数结束,线程就销毁.对于那些需要控制的线程,一般我们都是和互斥锁相互关联,从而来控制线程 的进度,一般我们创建子线程,一种线程是很常见的,那就是带有消息循环的线程. 消息循环是一个很有用的线程方式,曾经自己用C在Linux下面实现一个

  • Android的HTTP多线程下载示例代码

    本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 多线程断点需要的功能 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度. 多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 RandomAccessFile file = new RandomAccessFile("QQWubiSetup.exe",&q

  • 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">

随机推荐