在应用程序中使用 Thread 而不是使用 Android Service 来执行长时间运行的任务有什么缺点。如果我不使用 Android 服务进行长时间运行的任务会怎样?
5 回答
服务:
服务是一个组件,它runs in the background, without direct interaction with the user
. 由于该服务没有用户界面not bound to the lifecycle of an activity
。
Services are used for repetitive and potential long running operations
,如 Internet 下载、检查新数据、数据处理、更新内容提供商等。
可以为服务分配与前台活动相同的优先级。在这种情况下,需要为相关服务激活可见通知。它经常用于播放视频或音乐的服务。
主题:
它们是简单的可运行线程。您可以使用这些线程执行非 UI 内容,但不能在其中执行 UI 任务(因为 UI 不是线程安全的)。为了在这些线程中处理 UI,您将不得不使用Handlers
,这对于初学者来说很难掌握和理解它们。
因此,根据您的需求和应用程序,您可以选择最适合您的应用程序。
Service是一个应用程序组件,可以在后台执行长时间运行的操作,并且不提供用户界面。另一个应用程序组件可以启动一个服务,即使用户切换到另一个应用程序,它也会继续在后台运行。此外,组件可以绑定到服务以与其交互,甚至执行进程间通信 (IPC)。例如,服务可能会在后台处理网络事务、播放音乐、执行文件 I/O 或与内容提供者交互。
另一方面,线程是任何多任务操作系统的基石,可以被认为是在主进程中运行的小进程,其目的是至少在应用程序中实现并行执行路径的出现。
它们将根据要求使用,我们实际上不能指出它们中的任何一个的优缺点,因为它们在不同的情况下都是必不可少的。
如果我不使用 Android 服务进行长时间运行的任务会怎样?
您可能会很幸运,并且您的代码完成了。再说一次,您可能不会走运,并且您的代码会在随机时间点被杀死。
除了教科书对 AndroidService
是什么和 aThread
是什么的描述之外,与您的问题直接相关的两者之间的主要区别是操作系统如何威胁它们。
线程是一种在后台执行代码的方式,而服务是一种让 Android 知道您正在后台执行代码的方式。
就底层Linux内核而言,它只知道线程,只关心线程切换和优先级。有没有服务对此没有影响。
然而,就 Android 设备内存管理和任务优先级而言,Android 不知道也不关心进程中的线程。它只知道服务,并且只在主应用进程线程上与它们交互。
因此,只要您有一个线程处于活动状态,内核就会很高兴地尝试保持进程处于活动状态并为该线程执行分配 CPU 时间。
但是,除非您有活动、服务、内容提供程序或广播接收器,否则 Android 内存管理器可能会决定终止您的进程以回收其资源用于另一个更高优先级的进程,无论此时哪些线程可能正在工作。
因此,虽然如果用户正在与您的活动交互,您可以在单独的线程上运行东西,但如果您想确保后台任务成功完成并且不会在随机点中断,您需要将其包装在服务(最好是受活动约束的服务,或者通过显示通知提升到 UI 优先级的服务)。
请注意,拥有服务并不能保证您的代码将在后台运行。Android 将在应用程序进程的主线程上调用生命周期方法(onStartCommand/onBind/onCreate/OnDestroy)。您的代码必须启动一个线程以确保真正的后台执行。
强烈建议在 Android 中使用服务来执行前台和后台任务。我强烈建议您不要研究定义,而是专门研究 Android 中的 IntentService 类。从 API 级别 3 开始,此类可以为您的后台任务完成大部分工作线程繁重的工作。此类处理表示为 Intent 的异步请求。客户端使用 startService(Intent) 调用发送请求。该服务根据需要启动,使用工作线程依次处理每个 Intent,并在工作结束时自行停止。最酷的事情是,您可以将它与 AlarmManager 实现一起使用,每 10-15 分钟说出您想做什么,并且仍然不必担心线程和处理程序显式实现,如果您使用 Service 类则必须这样做。
这是有关如何实现它的一小段代码。
public class UpdateService extends IntentService {
public UpdateService() {
//constructor
}
@Override
public void onCreate() {
super.onCreate();
//Called by the system when the service is first created.
}
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStart(intent, startId);
return(START_REDELIVER_INTENT); //Intent Relidelivery
//You should not override this method for your
IntentService and remember onStart() for IntentService is
deprecated.
}
@Override
protected void onHandleIntent(Intent intent) {
//do your main background tasks here forget about threading doing anything
in here Android will do the heavylifting as required
}
@Override
public void onDestroy() {
super.onDestroy();
//finalize your objects GC etc here
//Called by the system to notify a Service that it is no longer
used and is being removed.
}
}
服务是您不需要用户输入或立即更新 ui 的长时间运行任务的最佳实现。如果您绝对不需要不使用线程和处理程序,因为您可能会遇到很多并发/死锁等问题。
希望这可以帮助。
什么都不会发生,我在异步任务中运行了一个算法大约 90 个小时。工作得很好。
异步任务:从 UI 中分离一个“重”任务,例如下载服务:从应用程序中分离一个任务,例如闹钟