在长时间运行的任务中使用Thread而不是在App中使用Android Service的缺点是什么。如果我不为长时间运行的任务使用Android服务会怎么样?
答案 0 :(得分:3)
<强>服务强>
服务是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
,与互联网下载一样,检查新数据,数据处理,更新内容提供商等。
可以为服务分配与前台活动相同的优先级。在这种情况下,需要为相关服务激活可见通知。它经常用于播放视频或音乐的服务。
<强>主题:强>
它们是简单的可运行线程。您可以使用这些线程执行非UI内容,但不能在其中执行UI任务(因为UI不是线程安全的)。为了处理这些线程中的UI,您将不得不使用Handlers
,这对初学者来说非常麻烦,可以掌握并了解它们。
因此,根据您的需求和应用程序,您可以选择最适合您的方式。
答案 1 :(得分:1)
Service是可以执行的应用程序组件 在后台长时间运行的操作并不提供用户 接口。另一个应用程序组件可以启动服务 即使用户切换到后台,也会继续在后台运行 另一个应用。此外,组件可以绑定到服务 与它交互甚至执行进程间通信 (IPC)。例如,服务可能处理网络事务,播放 全部是音乐,执行文件I / O或与内容提供商交互 来自背景。
另一方面,Threads是任何多任务处理的基石 操作系统可以被认为是迷你进程运行 在主要过程中,其目的是至少启用 应用程序中并行执行路径的出现。
它们将按照要求使用,我们实际上无法指出它们中的任何一个的利弊,因为它们在不同情况下都是必不可少的。
答案 2 :(得分:0)
如果我不为长时间运行的任务使用Android服务会怎样?
您可能会很幸运,您的代码也会完成。然后,你可能不会幸运,你的代码会在一个随机的时间点被杀死。
除了关于Android Service
是什么以及Thread
是什么的教科书说明之外,与您的问题直接相关的两者之间的主要区别在于操作系统如何威胁它们。
主题是在后台执行代码的一种方法,而服务是一种让Android识别<的方法/ strong>您正在后台执行代码。
就底层Linux内核而言,它只知道线程,只关心线程切换和优先级。是否有服务对此没有影响。
但是,就Android设备内存管理和任务优先级而言,Android不知道或不关心您的进程中的线程。它只知道服务,并且只在主应用程序进程线程上与它们交互。
因此,只要你有一个线程处于活动状态,内核就会很乐意尝试让进程保持活动状态并为该线程执行分配CPU时间。
但是,除非您有活动,服务,内容提供商或广播接收器,否则Android内存管理器可能会决定终止您的进程以回收其资源以用于其他更高优先级的进程,否无论什么线程可能在这一点上工作。
因此,如果用户正在与您的活动进行交互,您可以在单独的线程上运行东西,如果您想确保后台任务成功完成并且不会在随机点中断,则需要换行它在一个服务中(最好是一个受活动约束的服务,或者通过显示通知提升到UI优先级)。
请注意,拥有服务并不能保证其代码将在后台运行。 Android将在应用程序进程的主线程上调用生命周期方法(onStartCommand / onBind / onCreate / OnDestroy)。您的代码必须启动一个线程以确保真正的后台执行。
答案 3 :(得分:0)
强烈建议在Android中使用服务,以执行前台和后台任务。我强烈建议您专门在Android中查看IntentService类,而不是进入定义。从API Level 3开始,此类可以为您的后台任务完成大部分工作线程繁重工作。此类处理表示为Intents的异步请求。客户端使用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立即更新。如果你绝对不需要不使用线程和处理程序,因为你可能会遇到很多并发/死锁等问题。
希望这有帮助。
答案 4 :(得分:-2)
什么都不会发生,我在异步任务中运行了大约90个小时的算法。工作得很好。
异步任务:从UI分离“重”任务,例如下载 服务:从应用程序中分离任务,例如闹钟