`
daojin
  • 浏览: 690349 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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多线程环境下,正确管理服务的启动和停止,需要保证数据同步的正确性和原子性。使用并发工具,如`AtomicBoolean`,可以有效地防止竞态条件。同时,根据服务的重启需求,选择适当的启动模式也是实现...

    android 多线程下载

    在Android开发中,多线程下载是一项常见的任务,特别是在处理大文件时,为了提高下载速度和用户体验,开发者通常会采用多线程技术。本篇将深入探讨如何在Android环境中实现多线程下载,并结合断点续传功能,使得下载...

    android多线程断点续传

    在Android中实现多线程断点续传,可以使用以下方法: 1. 使用AsyncTask:AsyncTask是Android提供的一种轻量级的多线程解决方案,适合处理短时间的后台任务。不过,由于AsyncTask内部维护了一个线程池,不适用于大量...

    android下多线程示例代码

    在Android平台上,多线程是实现程序并发执行的关键技术,特别是在UI交互和后台任务处理上。本示例代码旨在帮助开发者深入理解并掌握在Android环境中如何有效地使用多线程。以下将详细介绍这5种不同的线程实现方式...

    Android应用源码之AndroidDownLoad(多线程断点续传).zip

    本源码示例——"Android应用源码之AndroidDownLoad(多线程断点续传)",就是针对这两个关键点进行实现的。下面将详细解释其中涉及的知识点。 首先,我们要理解什么是多线程下载。在单线程下载中,文件数据只能通过一...

    通过线程控制随机数产生与结束

    在Android开发中,线程是实现多任务并行执行的关键技术。"通过线程控制随机数...通过对这个Demo的学习,开发者可以提升自己在Android中进行多线程编程的能力,更好地处理后台任务,提高应用程序的响应性和用户体验。

    Android服务Service_详解.pdf

    Android服务(Service)是Android操作系统中四个核心应用程序组件之一,其他三个分别是Activity、BroadcastReceiver和ContentProvider,它们在Android应用开发中的作用和使用场景各不相同。Service的作用主要体现在...

    多线程断点续传

    在单线程环境中,程序按顺序执行,而多线程则可以并发地运行不同的部分,提升了系统的并行处理能力。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。Xutils,作为一款流行的Android开发工具库,它...

    java 多线程断点下载

    这种技术的关键在于利用多线程并发处理数据,提高下载速度,并且支持用户中断下载后,从上次停止的位置继续,避免了数据的重复传输。 首先,我们需要理解断点下载的基本原理。断点下载是指在文件下载过程中,如果...

    安卓Android源码——流媒体线程下载,播放,(支持断点).rar

    - **断点续传**:如果下载中断,可以记录当前已下载的进度,下次启动时从该位置继续下载,避免重复下载。 2. **流媒体播放** - **MediaPlayer类**:Android内置的MediaPlayer类是处理媒体播放的主要工具,它支持...

    android 多任务断点下载 DEMO

    总的来说,Android多任务断点下载是一项实用且复杂的功能,它涉及到网络编程、文件操作、线程控制等多个方面,需要开发者具备扎实的Android基础和良好的编程实践。通过学习和理解这个DEMO,开发者可以提升自己在...

    java 摇奖程序使用线程实现

    - **volatile**:确保多线程环境下变量的可见性,防止线程工作内存的副本未更新。 - **Lock接口与ReentrantLock**:提供了比`synchronized`更细粒度的锁控制,具有可重入性。 4. **线程状态**: - **新建(New)...

    Android性能之冷启动优化详析

    其中-S表示每次启动前先强行停止,-R表示重复测试次数。 每一次的输出如下所示信息。其中TotalTime代表当前Activity启动时间。 生命周期 Activity生命周期: 1. onCreate() 2. onStart() 3. onResume() 4. ...

    android编写Service入门_本地和远程调用参照.pdf

    使用远程服务,可以创建一个服务,然后在多个应用程序之间复用,减少重复代码。例如,一个天气预报服务可以被多个应用调用,获取最新的天气信息。 创建远程服务涉及到更多的步骤,包括定义AIDL接口、实现服务端...

    android 小闹钟源码

    在小闹钟应用中,需要确保在正确的时间启动和停止服务,以节省系统资源并避免用户界面的异常行为。 11. **异步操作**:为了避免阻塞主线程,设置闹钟或播放音乐等耗时操作通常应在子线程或AsyncTask中执行。 12. *...

    Android DeskClock

    《深入剖析Android DeskClock:源码解析与开发实践》 Android DeskClock是Android系统中内置的一款桌面...通过学习DeskClock,开发者可以深化对Android组件、服务、数据库以及多线程机制的理解,进一步提升开发技能。

    基于Android 手机小闹钟源码

    通过研究这个源码,开发者可以了解Android应用的基本架构,以及如何实现与系统服务的交互,特别是在时间管理和用户通知方面。此外,还可以学习到如何优化用户体验,比如在不同Android版本和设备上保持一致的行为。总...

    FileDownloader0_android_源码

    这个源码项目可以帮助开发者学习如何在Android上实现高效的文件下载功能,包括多线程下载的实现、断点续传的机制以及如何在Android系统中管理和调度这些任务。通过对源码的分析和实践,开发者可以提升对Android系统...

    python android api

    从上述内容可以看出,Python Android API 文档涵盖了使用 Python 脚本与 Android 系统进行交互的方方面面,从简单的剪贴板和输入输出操作,到复杂的蓝牙、相机、电池管理、位置服务和电话服务的高级功能。...

Global site tag (gtag.js) - Google Analytics