2013-05-29 83 views
0

我想我在這篇文章中遇到類似的問題:Return ArrayList and use it in another method problm訪問ArrayList內部類的問題

在幾個類ArrayList < ...>將被創建與「新」。在此列表中,我存儲了多個DataContainer(由另一個類定義)。

現在,如果我保存了所有的數據類,我會通過「OnMessageReceived」將此List返回到我的Activity。

奇怪的是,有時它可以工作,但大多數情況下我會得到一個空的列表。

我壓縮了代碼以獲得更好的視圖。如果我調試我可以看到數據是可訪問的,直到它跳轉到方法「公共無效messageReceived(最終ArrayList _Container){...}」

這種返回不可能嗎?

一些代碼:

(1類)的方法用於獲取數據:

public boolean run() { 

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

(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(); 
     } 
    }); 
}