我有一个可能很简单的问题。我有一个安卓服务;我在其中创建了一个通用服务类,它请求锁定并在单独的线程中执行实际(扩展)服务代码。下面的例子:
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代码中会发生什么?
对这些问题的任何指示和答案都将非常有帮助。在此先感谢您的帮助。
干杯