Android - 使用总线事件调用时,IntentService在UI线程上运行

时间:2015-05-29 18:38:32

标签: android multithreading intentservice otto

我有一个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线程上运行 !!!!

我不明白为什么。

我的目的是让后台线程加载/缓存数据。

不知道该怎么做。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

  

我不明白为什么。

引用the Otto documentation

  

默认情况下,与实例的所有交互都局限于主线程

更具体地说,Otto在发布它们的同一个线程上发送消息。

  

我的目的是让后台线程加载/缓存数据。

IntentService有一个后台线程,但只能调用onHandleIntent()。一旦onHandleIntent()返回,线程不仅会消失,而且服务也会被破坏。

我不清楚为什么你认为你需要这里的服务。假设你这样做,你将需要使用常规服务并安排你自己的后台线程,这样你就可以更好地控制服务和线程的生命周期。