1

我有一个 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 在辅助线程上执行,这是正常的。但是当我 从主用户界面使用总线事件调用onLoadSearchData时,它在用户界面线程上运行!!!!

我不明白为什么。

我的目的是有一个后台线程来加载/缓存数据。

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

4

1 回答 1

2

我不明白为什么。

引用Otto 文档

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

更具体地说,Otto 在发布消息的同一线程上传递消息。

我的目的是有一个后台线程来加载/缓存数据。

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

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

于 2015-05-29T18:49:16.980 回答