0

我使用 GraphView 库来可视化实时图表。该库示例在 2.X android 设备中运行良好,但在 4.X 设备中无法正常运行。仅当我单击屏幕时,图表才会刷新。我是 Android 的新手,但我认为问题可能出在 runnable 和 postDelayed 的使用上。

这是示例代码:

    package com.example.realtime;

import com.jjoe64.graphview.BarGraphView;
import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.GraphView.GraphViewData;
import com.jjoe64.graphview.GraphView.LegendAlign;
import com.jjoe64.graphview.GraphViewSeries;
import com.jjoe64.graphview.LineGraphView;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.LinearLayout;




public class RealTimeGraph extends Activity {
    private final Handler mHandler = new Handler();
    private Runnable mTimer1;
    private Runnable mTimer2;
    private GraphView graphView;
    private GraphViewSeries exampleSeries1;
    private GraphViewSeries exampleSeries2;
    private double graph2LastXValue = 5d;

private double getRandom() {
    double high = 3;
    double low = 0.5;
    return Math.random() * (high - low) + low;
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.graphs);

    // init example series data
    exampleSeries1 = new GraphViewSeries(new GraphViewData[] {
            new GraphViewData(1, 2.0d)
            , new GraphViewData(2, 1.5d)
            , new GraphViewData(2.5, 3.0d) // another frequency
            , new GraphViewData(3, 2.5d)
            , new GraphViewData(4, 1.0d)
            , new GraphViewData(5, 3.0d)
    });

    // graph with dynamically genereated horizontal and vertical labels
    if (getIntent().getStringExtra("type").equals("bar")) {
        graphView = new BarGraphView(
                this // context
                , "GraphViewDemo" // heading
        );
    } else {
        graphView = new LineGraphView(
                this // context
                , "GraphViewDemo" // heading
        );
    }
    graphView.addSeries(exampleSeries1); // data

    LinearLayout layout = (LinearLayout) findViewById(R.id.graph1);
    layout.addView(graphView);

    // ----------
    exampleSeries2 = new GraphViewSeries(new GraphViewData[] {
            new GraphViewData(1, 2.0d)
            , new GraphViewData(2, 1.5d)
            , new GraphViewData(2.5, 3.0d) // another frequency
            , new GraphViewData(3, 2.5d)
            , new GraphViewData(4, 1.0d)
            , new GraphViewData(5, 3.0d)
    });

    // graph with custom labels and drawBackground
    if (getIntent().getStringExtra("type").equals("bar")) {
        graphView = new BarGraphView(
                this
                , "GraphViewDemo"
        );
    } else {
        graphView = new LineGraphView(
                this
                , "GraphViewDemo"
        );
        ((LineGraphView) graphView).setDrawBackground(true);
    }
    graphView.addSeries(exampleSeries2); // data
    graphView.setViewPort(1, 4);
    graphView.setScalable(true);

    layout = (LinearLayout) findViewById(R.id.graph2);
    layout.addView(graphView);
}

@Override
protected void onPause() {
    mHandler.removeCallbacks(mTimer1);
    mHandler.removeCallbacks(mTimer2);
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    mTimer1 = new Runnable() {
        @Override
        public void run() {
            exampleSeries1.resetData(new GraphViewData[] {
                    new GraphViewData(1, getRandom())
                    , new GraphViewData(2, getRandom())
                    , new GraphViewData(2.5, getRandom()) // another frequency
                    , new GraphViewData(3, getRandom())
                    , new GraphViewData(4, getRandom())
                    , new GraphViewData(5, getRandom())
            });
            mHandler.postDelayed(this, 300);
        }
    };
    mHandler.postDelayed(mTimer1, 300);

    mTimer2 = new Runnable() {
        @Override
        public void run() {
            graph2LastXValue += 1d;
            exampleSeries2.appendData(new GraphViewData(graph2LastXValue, getRandom()), true);
            mHandler.postDelayed(this, 1000);
        }
    };
    mHandler.postDelayed(mTimer2, 1000);
}

}`

重要的代码在函数 OnResume 中。

我真的很感激任何提示......

提前致谢!

4

1 回答 1

0

我不明白你为什么要两次调用 posdelayed on 处理程序 - 一次在可运行对象内,一次在定义可运行对象之后......

但是,一旦视图更新,请尝试使视图无效()。我会这样做:

@Override
protected void onResume() {
    super.onResume();
    mTimer1 = new Runnable() {
        @Override
        public void run() {
            exampleSeries1.resetData(new GraphViewData[] {
                    new GraphViewData(1, getRandom())
                    , new GraphViewData(2, getRandom())
                    , new GraphViewData(2.5, getRandom()) // another frequency
                    , new GraphViewData(3, getRandom())
                    , new GraphViewData(4, getRandom())
                    , new GraphViewData(5, getRandom())
            });
            exampleSeries1.invalidate();
        }
    };
    mHandler.postDelayed(mTimer1, 300);

    mTimer2 = new Runnable() {
        @Override
        public void run() {
            graph2LastXValue += 1d;
            exampleSeries2.appendData(new GraphViewData(graph2LastXValue, getRandom()), true);
            exampleSeries2.invalidate();
        }
    };
    mHandler.postDelayed(mTimer2, 1000);
}

让我知道这是否适合您

于 2013-05-13T21:22:14.377 回答