2013-05-29 3 views
0

Я думаю, что у меня была аналогичная проблема, как в этом посте: Return ArrayList and use it in another method problm.Проблемы с доступом к классам внутри ArrayList

В нескольких классах ArrayList < ...> будет создан с "новым". В этом списке я храню несколько DataContainer (определенный другим классом).

Теперь, если я сохранил все классы данных, я верну этот список обратно в свою деятельность через «OnMessageReceived».

Странная вещь, иногда она работает, но в основном я получаю пустой список.

Я сжал код для лучшего обзора. Если я отлаживаю, я могу видеть, что данные доступны до тех пор, пока они не перейдут в метод «public void messageReceived (final ArrayList _Container) {...}"

Возможно ли такое возвращение?

Некоторые Код:

(класс 1) Способ получения данных:

public boolean run() { 

    try { 
     ... 
     try { 
      .... 
      while (mRun) {              
       if(in.ready()) {       
        ... 
        ...     
        mMessageListener.messageReceived(_ConvertData.GetMessage(new String(Puffer).substring(0,length)));      
       } 
      } 
     }   
    } 
} 

(Class 2)

public ArrayList<DatenContainer> GetMessage(String message) { 

    Sensoren SensorName = Sensoren.NONE; 
    int _Length = 0; 
    int _ID = 0; 
    double _TimeStamp = 0; 
    int _NumberOfPackage = 0; 
    String _msg = "";  

    while (!message.isEmpty()) { 
      ... 
      ... 
      Container.add(new DatenContainer(_Length, _ID, _TimeStamp, _NumberOfPackage, _msg, SensorName)); 
     } 
     catch (Exception e) {}    
    } 
    return Container; 
} 

(активность)

TCP_Client_Thread = new Thread() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      super.run(); 

      try { 
       // create a TCPClient object and 
       mTcpClient = new TCP_Client(new TCP_Client.OnMessageReceived() { 

        @Override 
        //here the messageReceived method is implemented 
        public void messageReceived(final ArrayList<DatenContainer> _Container) {            

         MainActivity.this.runOnUiThread(new Runnable() { 
          @Override 
          public void run() {          

           try {          
            for (DatenContainer datenContainer : _Container) { 
            ... 
            ...          
            } 
           } catch (Exception e) { 
            Show_Toast(e.toString()); 
           } 
          } 
         }); 
        }                   
       },Infos.getSERVERIP(),Infos.getSERVERPORT());    
      } 
      catch (Exception e) {}    
     } 
+1

Просьба построить простой тестовый чехол. Весь этот код с исключениями и доступом к TCP и т. Д. Просто скрывает проблему ... –

+0

Не могли бы вы предоставить ссылку на все три класса в zip? –

+1

Похоже, вы уже в основном там. Если вы использовали отладчик для поиска метода, в котором возникла проблема, вы должны пройти этот метод и узнать, когда что-то неожиданное произойдет с вашим контейнером. У меня было что-то подобное со мной, и мне пришлось сделать много пошаговой отладки, чтобы отследить ее. Проблема заключалась в непреднамеренном размещении закрывающей скобки, которая включала некоторый код инициализации, который я не хотел запускать для конкретного случая. Я просто переместил скобу, чтобы исправить ситуацию. Так как вы вложенные в брекеты, это может быть проблемой. – scottb

ответ

0

Теперь это работает. Я забыл синхронизирующий метод. Thx ребята, помогающие мне :)

@Override 
//here the messageReceived method is implemented 
public void messageReceived(final ArrayList<DatenContainer> _Container) {            

    MainActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() {          
      ArrayList<DatenContainer> Container; 

      synchronized (_Container) { 
       Container = _Container; 
      } 

      try {          
       if (Container != null && !Container.isEmpty()) { 

       for(int i = 0; i < Container.size(); i++) { 

         DatenContainer datenContainer = (DatenContainer)Container.get(i); 

         switch (datenContainer.get_ActSensor()) {            
         case SPEED: 
          edt_3.setText(datenContainer.get_Data()); 
          break; 
         case COG: 
          edt_4.setText(datenContainer.get_Data()); 
          break; 
         default: 
          break; 
         }             
        } 
       } 
      } 
      catch (Exception e) { 
       Show_Toast(e.toString()); 
      } 

      Container.clear(); 
     } 
    }); 
} 
Смежные вопросы