2

我有一个可能很简单的问题。我有一个安卓服务;我在其中创建了一个通用服务类,它请求锁定并在单独的线程中执行实际(扩展)服务代码。下面的例子:

abstract public class ParentService extends Service {


public static void getLocks(Context context) {
       //code to get locks
}

public abstract void doServiceJob();

@Override
public void onCreate() {
    super.onCreate();       
    //Run the service code in separate thread
    Thread serviceThread = new Thread() {
        public void run() {
            //Looper.prepare();
            doServiceJob();
            //Looper.loop();
        }
    };
    serviceThread.start();
}

@Override
public void onDestroy() {
       //release locks
}
}

在上面的例子中;即使 Looper.prepare() 和 Looper.loop() 没有在被调用的线程中调用,一切正常。

但是,如果我尝试通过 GPS 或网络获取位置;然后我有一个问题,代码没有运行说“无法在没有调用 Looper.prepare() 的线程内创建处理程序”。

我知道我们需要创建循环器和处理程序来与 UI 线程通信;对于影响 UI 的事件。但是获取位置会影响 UI 吗?是不是因为位置提供者也会尝试在我的手机顶部栏上绘制一个 GPS 图标,并且因为它没有在 UI 线程中运行;它不能那样做吗?

这里有什么问题,我可以通过调用 looper.prepare() 和 Looper.loop() 来解决这个问题;但是我需要了解以下内容?

  • 我知道服务在主线程上运行,与 UI 线程相同;这是否有效地意味着,服务有能力对 UI 进行更改,我们不这样做是因为它不是良好的用户体验,这就是为什么通过通知传达所有内容?(甚至通知也需要在 UI 线程上运行?)
  • 为什么位置提供程序需要在 UI 线程上运行?
  • 我没有在这里声明任何处理程序,我只是在调用 looper.prepare(); 那么消息队列如何在后台工作以及在下面的android代码中会发生什么?

对这些问题的任何指示和答案都将非常有帮助。在此先感谢您的帮助。

干杯

4

1 回答 1

1

您必须调用 Looper.Loop 的原因是它提供了后台操作在前台线程上执行代码的路线。来自后台线程的消息使用 Handler 对象发布到 UI 线程,而这些又需要 UI 线程调用 Looper.Loop 以获取实际的消息服务。这就是消息处理发生的地方:在 Looper.Loop 调用中。

于 2011-05-02T14:08:59.273 回答