2012-07-03 4 views
0

안드로이드를 처음 접했습니다. Achartengine을 사용하여 이진 파일에서 값을 읽는 동적 그래프를 그려 봅니다. 아래 코드는 내 코드입니다. 정기적으로 값을 업데이트하는 동적 실행 그래프가 필요합니다. 이것을 위해 나는 타이머를 가지고 그리고 타이머없이 그것을하려고 노력한다. 하지만 때마다 마지막 값이 업데이트되었을 때 최종 값으로 그래프가 표시됩니다. 나는 모든 업데이트가 완료된 후에 정적 그래프를 얻는다는 것을 의미합니다. 이 문제를 해결하는 방법을 알 수 없습니다. 에뮬레이터를 사용하여 코드를 테스트하고 있습니다. 에뮬레이터에 문제가 있거나 코드에 문제가 있습니까? 타이머없이 미리 감사드립니다Achartengine을 사용한 안드로이드 다이내믹 플롯

코드 : 타이머

public class RandomActivity extends Activity { 
private XYMultipleSeriesDataset eeg1 = new XYMultipleSeriesDataset(); 
private XYMultipleSeriesRenderer renderer_eeg1 = new XYMultipleSeriesRenderer(); 
private XYSeries series1; 
private GraphicalView view_eeg1; 


public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

renderer_eeg1.setAxisTitleTextSize(16); 
renderer_eeg1.setChartTitleTextSize(20); 
renderer_eeg1.setLabelsTextSize(15); 
renderer_eeg1.setLegendTextSize(15); 
renderer_eeg1.setMargins(new int[] {20, 30, 15, 0}); 
renderer_eeg1.setAxesColor(Color.BLUE); 
renderer_eeg1.setXTitle("Time"); 
renderer_eeg1.setChartTitle("eeg1"); 
XYSeriesRenderer seriesrenderer1 = new XYSeriesRenderer(); 
seriesrenderer1.setColor(Color.YELLOW); 
renderer_eeg1.addSeriesRenderer(seriesrenderer1); 
series1= new XYSeries("eeg1"); 
eeg1.addSeries(series1); 
int a; 
int b; 
add(); 

for(int r=0;r<=600;r++){ 

    if(r%2==0){ 
     a=1; 
     b=-1; 
    } 
    else{ 
     a=-1; 
     b=1; 
    } 

    series1.add(r, a); 
     if(r<=50){ 
     renderer_eeg1.setXAxisMax(50); 
     } 
     else if(r>50){ 
      double maxX = series1.getMaxX(); 
     double minX = maxX - 50; 
      renderer_eeg1.setXAxisMin(minX); 
     } 
     view_eeg1.repaint(); 
} 
} 


protected void onResume() { 
super.onResume(); 
if (view_eeg1== null) { 
LinearLayout layout_eeg1 = (LinearLayout) findViewById(R.id.chart1); 
view_eeg1= ChartFactory.getLineChartView(this, eeg1, renderer_eeg1); 
layout_eeg1.addView(view_eeg1,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
} else { 
view_eeg1.repaint();} 
} 

} 

코드 :이 그려진되지 않도록 차트 실제로보기에 추가되기 전에

public class RandomActivity extends Activity { 
private XYMultipleSeriesDataset eeg1 = new XYMultipleSeriesDataset(); 
private XYMultipleSeriesRenderer renderer_eeg1 = new XYMultipleSeriesRenderer(); 
private XYSeries series1; 
private GraphicalView view_eeg1; 


public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

renderer_eeg1.setAxisTitleTextSize(16); 
renderer_eeg1.setChartTitleTextSize(20); 
renderer_eeg1.setLabelsTextSize(15); 
renderer_eeg1.setLegendTextSize(15); 
renderer_eeg1.setMargins(new int[] {20, 30, 15, 0}); 
renderer_eeg1.setAxesColor(Color.BLUE); 
renderer_eeg1.setXTitle("Time"); 
renderer_eeg1.setChartTitle("eeg1"); 
XYSeriesRenderer seriesrenderer1 = new XYSeriesRenderer(); 
seriesrenderer1.setColor(Color.YELLOW); 
renderer_eeg1.addSeriesRenderer(seriesrenderer1); 
series1= new XYSeries("eeg1"); 
eeg1.addSeries(series1); 
int a; 
int b; 
add(); 

for(int r=0;r<=600;r++){ 

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


    if(r%2==0){ 
     a=1; 
     b=-1; 
    } 
    else{ 
     a=-1; 
     b=1; 
    } 

    series1.add(r, a); 
     if(r<=50){ 
     renderer_eeg1.setXAxisMax(50); 
     } 
     else if(r>50){ 
      double maxX = series1.getMaxX(); 
     double minX = maxX - 50; 
      renderer_eeg1.setXAxisMin(minX); 
     } 
     view_eeg1.repaint(); 
} 
} 


protected void onResume() { 
super.onResume(); 
if (view_eeg1== null) { 
LinearLayout layout_eeg1 = (LinearLayout) findViewById(R.id.chart1); 
view_eeg1= ChartFactory.getLineChartView(this, eeg1, renderer_eeg1); 
layout_eeg1.addView(view_eeg1,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
} else { 
view_eeg1.repaint();} 
} 

} 

답변

1
  1. 당신은 다시 칠.
  2. 코드가 작성중인 스레드 안에 없습니다.
  3. 600 개의 스레드를 만들고 있지만 아무 것도 실행하지 않습니다.
  4. onResume 코드는 onResume이 여러 번 호출되었다고 생각되는 것처럼 보입니다. 일반적으로 false입니다.
  5. 활동에 Add() 함수가 없습니다. 수행해야 할 작업이 있습니까?

내가이 더 잘 작동합니다 생각 :) ...하지만 난 (수면 시간을 단축하려고 할 때 즉, 이동 속도 그래프를 만들 :

public class RandomActivity extends Activity { 
private XYMultipleSeriesDataset eeg1 = new XYMultipleSeriesDataset(); 
private XYMultipleSeriesRenderer renderer_eeg1 = new XYMultipleSeriesRenderer(); 
private XYSeries series1; 
private GraphicalView view_eeg1; 

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    renderer_eeg1.setAxisTitleTextSize(16); 
    renderer_eeg1.setChartTitleTextSize(20); 
    renderer_eeg1.setLabelsTextSize(15); 
    renderer_eeg1.setLegendTextSize(15); 
    renderer_eeg1.setMargins(new int[] {20, 30, 15, 0}); 
    renderer_eeg1.setAxesColor(Color.BLUE); 
    renderer_eeg1.setXTitle("Time"); 
    renderer_eeg1.setChartTitle("eeg1"); 
    XYSeriesRenderer seriesrenderer1 = new XYSeriesRenderer(); 
    seriesrenderer1.setColor(Color.YELLOW); 
    renderer_eeg1.addSeriesRenderer(seriesrenderer1); 
    series1= new XYSeries("eeg1"); 
    eeg1.addSeries(series1); 
    int a; 
    Thread timer = new Thread(){ 
     public void run(){ 
      try{ 
       for(int r=0;r<=600;r++){ 
        sleep(500); 
        if(r%2==0){ 
         a=1; 
        } 
        else{ 
         a=-1; 
        } 
        series1.add(r, a); 
        if(r<=50){ 
         renderer_eeg1.setXAxisMax(50); 
        } 
        else if(r>50){ 
         double maxX = series1.getMaxX(); 
         double minX = maxX - 50; 
         renderer_eeg1.setXAxisMin(minX); 
        } 
        view_eeg1.repaint(); 

       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }; 
    timer.start() 
    } 

    protected void onResume() { 
     super.onResume(); 
      if (view_eeg1== null) { 
       LinearLayout layout_eeg1 = (LinearLayout) findViewById(R.id.chart1); 
       view_eeg1= ChartFactory.getLineChartView(this, eeg1, renderer_eeg1); 
       layout_eeg1.addView(view_eeg1,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
       } else { 
       view_eeg1.repaint();} 
      } 
     } 
    } 
} 
+0

덕분에 많은 사람을 일했다) 응용 프로그램이 충돌합니다. 나는 300ms까지 갈 수 있는데, 그 아래는 그냥 추락한다. 어떤 해결책? 또 하나, 내가 이것을 시도 할 때 14 개의 그래프를 한 화면에 표시하면 (나는 너무 부피가 크다) 잠시 동안 간 다음 충돌이 일어난다. 왜 그런지 설명해 주시겠습니까? achartengine은 빠른 처리가 불가능합니까? – user1090992

+0

내가 수면을 낮출 때 view_eeg1이 인스턴스화되기 전에 view_eeg1.repaint()가 실행 조건 인 것 같아요. 인스턴스 생성을 onCreate로 이동하거나 컨트롤을 추가하여 다시 그리기 전인지 확인해야합니다. –

+0

안녕하세요,이 코드를 실행하기 전에 앱에 achart 엔진 API (Jar 파일)를 추가해야합니다. api 파일 [here] (http://code.google.com/p/achartengine/downloads/detail?name=achartengine-1.0.0.jar&can=2&q=)을 다운로드 할 수 있습니다. – harikrishnan

관련 문제