2015-05-29 5 views
1

У меня есть IntentService для выполнения фонового запроса на мой API. Я использую Otto Bus для общения с ним.Android - IntentService работает в потоке пользовательского интерфейса при вызове с событием шины

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 с событием автобуса от главного ui, , он работает на потоке пользовательского интерфейса !!!!

Я не понимаю, почему.

Моя цель - иметь фоновый поток для загрузки/кеширования данных.

Не знаете, как это сделать. Спасибо за помощь.

ответ

2

Я не понимаю, почему.

Цитирование the Otto documentation:

По умолчанию, все взаимодействие с экземпляром ограничивается в основном потоке

Более конкретно, Отто доставляет сообщения в том же потоке, где они размещены с ,

Моя цель - иметь фоновый поток для загрузки/кеширования данных.

IntentService имеет фоновый поток, но только для вызова onHandleIntent(). Как только onHandleIntent() вернется, не только поток исчезнет, ​​но служба будет уничтожена.

Непонятно, почему вы считаете, что вам нужна услуга здесь. Предполагая, что вы это сделаете, вам нужно будет использовать регулярный сервис и организовать свой собственный фоновый поток, чтобы вы могли лучше контролировать срок службы службы и поток.

+0

Хорошо. IntentService не годится. Предположим, у меня есть служба для управления моими потоками. Он работает на потоках пользовательского интерфейса, поэтому нет проблем с тем, чтобы использовать Отто для связи с моей деятельностью. Но смогу ли я использовать Отто для отправки событий из моих потоков в пользовательский интерфейс? – user1391967

+0

@ user1391967: В то время как вы можете использовать Otto, вам придется использовать параметр 'ThreadEnforcer.ANY' (см. Их документы), и сообщения будут доставлены в фоновом потоке, заставляя действие использовать' runOnUiThread() 'или что нибудь. Лично я использую EventBus от greenrobot, который работает как Otto, но имеет более гибкие варианты потоков. – CommonsWare

+0

Ну, я попробую службу для запуска потоков и использования буфера Greenrobot. Благодарю. – user1391967