2012-11-11 5 views
2

입력 텍스트 파일을 기반으로 여러 가지 작업을 수행하는 앱을 제작 중입니다. 먼저 텍스트 파일의 데이터를 구문 분석하고 유용한 정보를 추출하고 linkedList를 작성합니다. Linked List는 BinaryBlock 객체 그룹입니다. 거기에서 우리는 BinaryBlocks의 getwfs() 함수를 동적으로 그래프로 나타내기를 원합니다. 이 시점에서 우리는 다소 그래프가 작동하지만 시간이 지남에 따라 하나의 큰 덩어리로 그려지고 끝까지 스크롤됩니다.AChartEngine (동적)으로 Android에서 LinkedList를 그래프로 표시

BinaryBlock은 여기에 나열됩니다 :

이 완전히 테스트 및 기능과 프로그램의 큰 맥락에서 정말에만 중요 : 메인 하네스는 여기에 나열됩니다

// BinaryBlock.java 

public class BinaryBlockLite { 


private int pwda[], wfs[]; 

String lineData; 

public BinaryBlockLite(String data){ // class constructor 
    lineData = data; 
    pwda = new int[5]; 
    wfs = new int[4]; 

    setWfs(); 

}//end constructor 

    public String WfsToString(){ 
    if (wfs.length == 0) 
     return ""; 

    String data = "Channel 2: "; 
    for(int i = 0; i < wfs.length; ++i){ 
     data = data + "wfs[" + i + "]=" + wfs[i] + " "; 
    } 
    return data + "\n"; 
} 


    //=========================================================== 
// Setters 
//============================================================= 


//read the 5 individual bytes of the Pwda from LineData and into the pwda[] array 
private void setPwda(){ 
    int location = 13; 
    for(int i = 0; i < 5; ++i){ 

     String temp = "" + lineData.charAt(++location) + lineData.charAt(++location); 

     pwda[i] = Integer.parseInt(temp, 16); 
    } 
} 

//logically manipulate the 5 bytes of the PWDA into 4 10-bit WFSs 
private void setWfs(){ 
    setPwda(); 
    int j = 0; 

    for (int i = 0; i < 4; ++i){ 
     wfs[i] = ((pwda[j] << 2) | ((pwda[j + 1] >> 6) & 0x03)) & 0x03ff; 
     wfs[++i] = ((pwda[j + 1] << 4) | ((pwda[j + 2] >>> 4) & 0x0f)) & 0x03ff; 
     wfs[++i] = ((pwda[j + 2] << 6) | ((pwda[j + 3] >>> 2) & 0x3f)) & 0x03ff; 
     wfs[++i] = ((pwda[j + 3] << 8) | ((pwda[j + 4] >>> 0) & 0xff)) & 0x03ff; 
    } 
} 




    //=========================================================== 
// Getters 
//============================================================= 


public int[] getPwda(){ 
    return pwda; 
} 
public int[] getWfs(){ 
    return wfs; 
} 




}//end BinaryBlock Class 

가 : 문제는 단순히 매번 다시 칠하고 화면에 그려주는 대신 한 번에 모든 점을 그래프로 표시합니다.

//MainActivity.java 

import android.os.Bundle; 
import android.app.ActionBar.LayoutParams; 
import android.app.Activity; 
import android.content.Context; 
import android.content.res.AssetManager; 
import android.graphics.Color; 
import android.view.Menu; 

import android.view.View; 
import android.widget.Button; 
import android.widget.LinearLayout; 

import com.smith.fsu.wave.BinaryBlockLite; 

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.LinkedList; 
import java.util.ListIterator; 

import org.achartengine.ChartFactory; 
import org.achartengine.GraphicalView; 
import org.achartengine.model.XYMultipleSeriesDataset; 
import org.achartengine.model.XYSeries; 
import org.achartengine.renderer.XYMultipleSeriesRenderer; 
import org.achartengine.renderer.XYSeriesRenderer; 


public class MainActivity extends Activity { 

    public static LinkedList<BinaryBlockLite> list; 
    Button btnMain; 
    Boolean fileLoaded = false; 
    int xTick = 0, 
     lastMinX = 0; 
    Context context = this; 

    // 

    //////////////////////////////////////////////////////////////// 
    //import test 


    private XYMultipleSeriesDataset WFDataset = new XYMultipleSeriesDataset(); 
    private XYMultipleSeriesRenderer WaveFormRenderer = new XYMultipleSeriesRenderer(); 
    private XYSeries WFCurrentSeries; 
    private GraphicalView WFChartView; 

    ////////////////////////////////////////////////////////////////////////// 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     list = new LinkedList<BinaryBlockLite>(); 
     btnMain=(Button)findViewById(R.id.btnMain); 
     WaveFormRenderer.setAxisTitleTextSize(16); 
     WaveFormRenderer.setChartTitleTextSize(20); 
     WaveFormRenderer.setLabelsTextSize(15); 
     WaveFormRenderer.setLegendTextSize(15); 
     WaveFormRenderer.setMargins(new int[] {20, 30, 15, 0}); 
     WaveFormRenderer.setAxesColor(Color.YELLOW); 

     String seriesTitle = "Input Data"; 
     XYSeries series = new XYSeries(seriesTitle); 

     WFDataset.addSeries(series); 
     WFCurrentSeries = series; 

     XYSeriesRenderer renderer = new XYSeriesRenderer(); 
     renderer.setColor(Color.GREEN); 
     WaveFormRenderer.addSeriesRenderer(renderer); 
     WaveFormRenderer.setXAxisMin(0.0); 
     WaveFormRenderer.setXAxisMax(500); 


//  renderer.setFillBelowLine(true) ; 
//  renderer.setFillBelowLineColor(Color.BLUE); 
    } 







    public void chartClick(View view) throws IOException{ 

       String strData = ""; 
       AssetManager amInput = context.getAssets(); 
       BufferedReader reader; 
       InputStream is = null; 
       try { 
        is = amInput.open("Dinamap-Data.txt"); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       reader = new BufferedReader(new InputStreamReader(is)); 

       try { 
        while((strData = reader.readLine()) != null) { 


         addBlock(strData); //call to paint line 

        } 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }//while loop 
       try { 
        reader.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 




    }//end mainClick() method for btnMain 










    public void writeClick(View view){ 
     //write decimal data for wfs out to file from LinkedList<BinaryBlock> 
     //using WfsToString() method of BinaryBlock class in separate thread 
     (new Thread(new Runnable() { 
      @Override 
      public void run() { 
       FileOutputStream fos = null; 
       try { 
        fos = openFileOutput("wfs.txt", Context.MODE_WORLD_READABLE); 
       } catch (FileNotFoundException e1) { 
        e1.printStackTrace(); 
       } 
       ListIterator<BinaryBlockLite> itr = list.listIterator(); 
       while (itr.hasNext()){ 
        String temp = itr.next().WfsToString(); 
        try { 
         fos.write(temp.getBytes()); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       try { 
        fos.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } 
     })).start(); 
     btnMain.setEnabled(false); 
    } 












    private void addBlock(final String strData) { 
     new Thread(new Runnable() { 
      public void run() { 


       int wfs[]; 

       //read line into binaryBlockLite object and store object in Linked List 
       BinaryBlockLite bb = new BinaryBlockLite(strData); 
       list.add(bb); 

       //get the wfs data from the BinaryBlockLite object 
       wfs = new int[bb.getWfs().length]; 
       wfs = bb.getWfs(); 

       //grab each wfs individually and paint to the chart, and increment xTick 
       for (int k = 0; k < wfs.length; ++k){ 
        /* check if we need to shift the x axis */ 
        if (xTick > WaveFormRenderer.getXAxisMax()) { 
         WaveFormRenderer.setXAxisMax(xTick); 
         WaveFormRenderer.setXAxisMin(++lastMinX); 
        } 

        if (wfs[k] > 1000){ 
         WFCurrentSeries.add(xTick, WFCurrentSeries.getY(xTick - 1)); 
        } 
        else{ 
         WFCurrentSeries.add(xTick, wfs[k]); 
        } 
        ++xTick;  
       } 
       WFChartView.repaint(); 

      } 
     }).start(); 

    } 















    @Override 
    protected void onResume() { 

     super.onResume(); 
     if (WFChartView == null) { 
      LinearLayout layout = (LinearLayout) findViewById(R.id.WFchart); 
      WFChartView = ChartFactory.getLineChartView(this, WFDataset, WaveFormRenderer); 

      layout.addView(WFChartView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
//   boolean enabled = WFDataset.getSeriesCount() > 0; 
//   setSeriesEnabled(enabled); 
      } else { 
       WFChartView.repaint(); 
      } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 

내가 생각하기에 너무 간단하거나 스레딩 문제인데, 내가 충분히 해본 적이없는 것 같습니다. 어떤 도움을 주시면 감사하겠습니다.

답변

0

코드를 살펴보면 시리즈에 모든 데이터를 추가 한 다음 repaint으로 전화하는 것이 나타납니다.

당신은 다음 for 루프 내부의 repaint를 이동하고 repaint을 실제로 작업을 수행 할 UI 스레드에 기회를주고, 내부 Thread.sleep()을 넣어, 데이터를 점진적으로 추가 될합니다.

+0

우리가 시도했지만 여전히 작동하지 않습니다. 우리는 그것들을 별개의 두 개의 쓰레드로 분리했지만 마지막 순간까지 멈추고 전체 그래프를 다시 한 번 내뱉었다 고 생각했습니다. 어떤 이유로 든 동적 인 것은 아닙니다. – Gann14

관련 문제