2

入力テキスト ファイルに基づいていくつかのことを行うアプリを作成しています。まず、テキスト ファイル内のデータを解析して有用な情報を抽出し、linkedList を作成します。リンク リストは、BinaryBlock オブジェクトのグループです。そこから、BinaryBlocks の getwfs() 関数を動的にグラフ化します。この時点で、グラフはある程度機能していますが、経時的にグラフ化する代わりに、1 つの大きな塊でグラフ化し、最後までスクロールします。

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

私はそれが非常に単純であるか、私が十分に遊んでいないスレッドの問題だと思います. どんな助けでも大歓迎です。

4

1 に答える 1

0

コードを見ると、すべてのデータを系列に追加してから を呼び出していることがわかりますrepaint

データを徐々に追加したい場合は、 をループのrepaint内側に移動して を内側に配置し、UI スレッドが実際に を実行できるようにします。forThread.sleep()repaint

于 2012-11-12T17:12:47.417 に答える