0

この投稿のような同様の問題が発生したと思います: Return ArrayList and use it in another method problm .

複数のクラスでは、ArrayList<...> が「new」で作成されます。このリストには、いくつかの 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)));                      
                }
            }
        }           
    }
}

(クラス 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) {}              
        }
4

1 に答える 1

0

今では動作します。同期方法を忘れました。私を助けてくれてありがとう:)

@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();
        }
    });
}
于 2013-05-30T06:54:57.847 に答える