У меня есть 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, , он работает на потоке пользовательского интерфейса !!!!
Я не понимаю, почему.
Моя цель - иметь фоновый поток для загрузки/кеширования данных.
Не знаете, как это сделать. Спасибо за помощь.
Хорошо. IntentService не годится. Предположим, у меня есть служба для управления моими потоками. Он работает на потоках пользовательского интерфейса, поэтому нет проблем с тем, чтобы использовать Отто для связи с моей деятельностью. Но смогу ли я использовать Отто для отправки событий из моих потоков в пользовательский интерфейс? – user1391967
@ user1391967: В то время как вы можете использовать Otto, вам придется использовать параметр 'ThreadEnforcer.ANY' (см. Их документы), и сообщения будут доставлены в фоновом потоке, заставляя действие использовать' runOnUiThread() 'или что нибудь. Лично я использую EventBus от greenrobot, который работает как Otto, но имеет более гибкие варианты потоков. – CommonsWare
Ну, я попробую службу для запуска потоков и использования буфера Greenrobot. Благодарю. – user1391967