为什么我的Android服务会阻塞用户界面?

5
我从Activity A创建了一个服务(service B),而从service B,我又创建了另一个服务(service C)。以前,服务C是一个线程而不是一个服务,因为长期运行会出现问题,所以我将其改成了一个服务。服务C使用一个while循环,并且每隔3秒进行一次Thread.sleep调用。但通常情况下,它不会停止。日志显示服务正在运行,但UI被阻塞,几分钟后系统会询问我是否要关闭它。
如何使此服务不阻塞呢?

1
你是否在服务C中创建了线程,因为服务也在主线程中运行。 - Dheeresh Singh
我只是从服务B调用startService来启动服务C。 - dinesh707
那么B服务是在其他线程中执行它的工作吗? - Dheeresh Singh
它(服务B)仅调用一些位置监听器。 - dinesh707
5个回答

4

根据文档,服务并不是独立的进程。因此,请按照以下步骤操作以使其正常工作:

  1. 从任何你想要开始的地方启动一个服务
  2. 在你编写的服务类中,编写另一个私有类来扩展线程,它将确保所有后台任务都在一个与邮件进程分离的后台线程中运行
  3. 从服务类的 onCreate 方法中启动一个线程。如果你在 onStartCommand 中开始你的后台工作,可能会意外地启动多个执行相同任务的服务。 例如:你在活动上放置了一个按钮,用于启动后台服务。如果你不小心多次点击了它,它将在后台启动许多个服务。

    因此,如果你使用服务中的 override onCreate 方法,它将检查服务是否已经运行,如果没有运行,则启动服务。否则,它将跳过并不会启动另一个服务。


3

从Android的服务文档中得知:

服务不是一个独立的进程。服务对象本身并不暗示它在自己的进程中运行;除非另有规定,否则它将在与其所属应用程序相同的进程中运行。

服务不是线程。它本身不是在主线程之外执行工作的手段(以避免应用程序未响应错误)。

在这种情况下最好的方法是启动一个新线程,然后从那里调用服务。


但是当我将它在一个线程中运行更长时间时,线程会导致整个应用程序崩溃。:( - dinesh707
请您能够把代码和错误日志粘贴在这里吗?这将会很有帮助。 - Mukund Samant

2
我认为服务C在主线程上运行,尝试创建另一个线程(新线程或异步任务)。

0

服务始终在主线程上运行。 您需要在服务C中生成后台线程或重复运行TimerTask等,以避免阻塞UI线程。


0

您可以像这样在单独的线程中启动您的服务:

Thread newThread = new Thread(){
   Intent serviceIntent = new Intent(getApplicationContext(), YourService.class);
   getApplicationContext().startService(serviceIntent);
 };
 newThread.start();

请参考此评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接