Android 4.0中的Runnable和postdelayed(实时GraphView库)

时间:2013-05-13 21:13:08

标签: android real-time runnable postdelayed android-graphview

我使用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中。

我非常感谢任何提示...

提前致谢!

1 个答案:

答案 0 :(得分:0)

我不明白你为什么要在处理程序上调用posdelayed两次 - 一次在runnable中,一次在定义runnable后...

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

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

如果这对您有用,请告诉我