0

В службе я заселение в ArrayList, который я потом вернуться к вызывающему деятельности:ArrayList прибывает пустым в handleMessage Андроида() метод

В службе (здесь, resultArrayList содержит элементы класса ArrayList<MyObjs>) :

public class DataFetchService extends BaseService { 

    @Override 
    protected void onHandleIntent(final Intent intent) { 
     super.onHandleIntent(intent); 

     // Do some work here that populates resultArrayList... 

     final Bundle bundle = new Bundle(); 
     bundle.putSerializable(BaseService.RESULT_OBJ, resultArrayList); 
     message.setData(bundle); 

     try { 
      final Messenger messenger = startIntent.getParcelableExtra(BaseService.PARAM_MESSENGER); 
      messenger.send(message); 
     } catch (RemoteException e) { 
      L.p("Help!"); 
     } 

От BaseService:

public class BaseService extends IntentService { 
    protected ArrayList<MyObjs> resultArrayList = new ArrayList<>(); 
    // Yada yada... 

В handleMessage своей деятельности в():

@Override 
public boolean handleMessage(final Message msg) { 

    final Bundle bundle = msg.getData(); 

    @SuppressWarnings("unchecked") 
    final ArrayList<MyObjs> nodes = (ArrayList<MyObjs>) bundle.getSerializable(BaseService.RESULT_OBJ); 

    if (nodes == null) { 
     //App never enters this 
     return 
    } 

    if (nodes.size() == 0) { 
     // Always enters here! 
     // If I set a breakpoint here, the IDE tells me nodes size is 1 
    } 

Странная вещь, что если я поставил точку останова внутри if (nodes.size == 0) { кода, среда показывает, что nodes действительно содержит элементы (говорит размер = 1, и я могу расширить ее и увидеть переменные), даже если он входит в это.

Любая идея в чем проблема? Это может быть условие гонки между другими службами, отправляющими данные обратно handleMessage()?

+0

Когда вы пошагово с отладчиком, она по-прежнему введите 'if'? – shmosel

+0

Покажите свою инициализацию resultArrayList – barq

+0

очистите и перестройте свой проект. – samirk433

ответ

0

Я не уверен в причинах этой ошибки, но создание нового ArrayList<> перед отправкой из службы, похоже, исправить.

Так следующее делает его работу:

final Bundle bundle = new Bundle(); 

    // Created this new ArrayList 
    final ArrayList<MyObjs> newArrayList = new ArrayList<>(); 

    // Add items to the new ArrayList 
    newArrayList.addAll(resultArrayList); 

    // Send the new ArrayList and NOT the other one. 
    bundle.putSerializable(BaseService.RESULT_OBJ, newArrayList); 
    message.setData(bundle); 

    try { 
     final Messenger messenger = startIntent.getParcelableExtra(BaseService.PARAM_MESSENGER); 
     messenger.send(message); 
    } catch (RemoteException e) { 
     L.p("Help!"); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^