0

ブルートゥースから脳波信号を受信し、achartengineを使用してリアルタイムで表示するAndroidアプリケーションを開発しています。非同期タスクを使用してグラフを表示し、更新します。しかし、毎回ConcurrentModificationExceptionが発生します。グラフがしばらく表示された後、そのエラーが発生します。以下は私のコードです。

mstart.setOnClickListener(new OnClickListener() {

         @Override
        public void onClick(View arg0) 
        {
            // TODO Auto-generated method stub
            // tv.setText("Fetal Heart rate loading..");

//               index = 0;
                flag = true;  



             if(fhr_alg!=null)
                    fhr_alg = null;

             fhr_alg = new AddStringTask();

             algo_done = false;
             /*curr = 5;
             counter = 0;*/
////                a1.setFlag(true);
                //a1.setMax(0);


            Thread tt = new Thread()
            {
                public void run()
                {
                    try{
                        sleep(600);                             
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }finally{

                        fhr_alg.execute();

                    }
                }
            };tt.start();
             if (view_eeg1== null) {
                    LinearLayout layout_eeg1 = (LinearLayout) findViewById(R.id.layout2);
                    view_eeg1= ChartFactory.getLineChartView(BluetoothConnect.this, eeg1, renderer_eeg1);
                  //  layout_eeg1.
                    layout_eeg1.addView(view_eeg1);
                    } else {
                    view_eeg1.repaint();}
            // w1.loadUrl("javascript:callJS()");               
             mstart.setEnabled(false);


        }           
    });



class AddStringTask extends android.os.AsyncTask<Void, Integer, Integer> {
    @Override
    protected void onPostExecute(Integer result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        algo_done=true;
        //Toast.makeText(Html.this, "Done Algo !", Toast.LENGTH_SHORT).show();
    }

    @SuppressLint("UseValueOf")
    @Override
    protected Integer doInBackground(Void... unused) {


        try {
            for(int r=0;r<=5000;r++){
                //Thread.sleep(300); 

                series1.add(r,data[r]);
              //  w2.loadUrl("javascript:count(\""+data[r]+"\")"); 

                if(r<=250){
                    renderer_eeg1.setXAxisMax(250);
                }
                else if(r>250){
                    double maxX = series1.getMaxX();
                    double minX = maxX - 250;
                    renderer_eeg1.setXAxisMin(minX);
                    renderer_eeg1.setXAxisMax(maxX);
                }
                view_eeg1.repaint();                   
                publishProgress((int)data[r]);
                SystemClock.sleep(600);

            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 


        return (0);

    }

    @Override
    protected void onProgressUpdate(Integer ... value) {


        int fhr=value[0];
        view_eeg1.repaint();
        w2.loadUrl("javascript:count(\""+fhr+"\")");            
        //a1.setfhr(curr, fhr);
        //curr++;           


    }

}

なぜこのエラーが発生するのか、そしてそれを解決する方法を誰かに教えてもらえますか?ありがとう

4

1 に答える 1

2

UIをUIスレッドではないスレッドに更新する際の問題。以下のようにdoinbackgroundを使用し、doInbackgroundのUIを変更するコードを削除する必要があります。

于 2012-12-10T09:36:45.293 に答える