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

Android - IntentService runs on UI thread when called with bus event

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

我不明白为什么。

我的目的是为 load/cache 数据创建一个后台线程。

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

I don't understand why.

引用 the Otto documentation:

By default, all interaction with an instance is confined to the main thread

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

My purpose is to have a background thread to load/cache data.

IntentService 有一个后台线程,但只调用 onHandleIntent()。一旦onHandleIntent() returns,不仅线程消失了,服务也被销毁了。

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