我有一个IntentService来对我的API执行后台请求。 我正在使用Otto Bus与它进行通信。
public class MyService extends IntentService {
private MyAPI mApi;
private MyBus mBus;
MyService () {
super("MyService ");
}
@Subscribe
public void onLoadSearchData(LoadSearchDataEvent event) {
Log.d("onLoadSearchData "+ Thread.currentThread().getName());
mApi.loadSomeData();
}
@Override
protected void onHandleIntent(Intent intent) {
Thread.currentThread().setName(getClass().getCanonicalName());
Log.d("Thread name " + Thread.currentThread().getName());
if (mApi==null) mApi = new MyAPI(getApplicationContext());
if (mBus==null) {
mBus = MyBus.getInstance();
mBus.register(this);
}
}
}
onHandleIntent在辅助线程上执行,这是正常的。 但是当我使用来自主ui的总线事件调用 onLoadSearchData 时,它在UI线程上运行 !!!!
我不明白为什么。
我的目的是让后台线程加载/缓存数据。
不知道该怎么做。谢谢你的帮助。
答案 0 :(得分:2)
我不明白为什么。
默认情况下,与实例的所有交互都局限于主线程
更具体地说,Otto在发布它们的同一个线程上发送消息。
我的目的是让后台线程加载/缓存数据。
IntentService
有一个后台线程,但只能调用onHandleIntent()
。一旦onHandleIntent()
返回,线程不仅会消失,而且服务也会被破坏。
我不清楚为什么你认为你需要这里的服务。假设你这样做,你将需要使用常规服务并安排你自己的后台线程,这样你就可以更好地控制服务和线程的生命周期。