如何动态呈现数据并实时更新更改

时间:2019-06-30 09:42:48

标签: java android

我对Java和android studio还是很陌生,这是我的第一个项目,因此对此的任何帮助都将大有帮助。我们正在尝试构建一个可以在小部件中显示ceratin实时数据的应用程序,现在仅用于试用,我们正在使用随机数生成器进行调试,它可以正常工作,但问题是我们必须关闭该应用程序并再次返回查看已使用的小部件中的任何更改。为此,我已在存储库之后使用了任何图表:here

当前,我们尝试部署可以在here中找到的温度计图表。

我尝试使用计时器,但这没有帮助

MainActivity.java看起来像这样:

  package com.anychart.sample.charts;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.anychart.AnyChart;
import com.anychart.AnyChartView;
import com.anychart.chart.common.dataentry.SingleValueDataSet;
import com.anychart.charts.LinearGauge;
import com.anychart.enums.Anchor;
import com.anychart.enums.Orientation;
import com.anychart.enums.Position;
import com.anychart.sample.R;
import com.anychart.scales.Base;
import com.anychart.scales.Linear;

public class ThermometerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chart_common);

        AnyChartView anyChartView = findViewById(R.id.any_chart_view);
        anyChartView.setProgressBar(findViewById(R.id.progress_bar));

        LinearGauge linearGauge = AnyChart.linear();

        // TODO data
        int random = (int)(Math.random() * 50 + 1);
        linearGauge.data(new SingleValueDataSet(new Integer[] { random }));

        linearGauge.tooltip()
                .useHtml(true)
                .format(
                        "function () {\n" +
                        "          return this.value + '°' + 'C' +\n" +
                        "            ' (' + (this.value * 1.8 + 32).toFixed(1) +\n" +
                        "            '°' + 'F' + ')'\n" +
                        "    }");

        linearGauge.label(0).useHtml(true);
        linearGauge.label(0)
                .text("C°")
                .position(Position.LEFT_BOTTOM)
                .anchor(Anchor.LEFT_BOTTOM)
                .offsetY("20px")
                .offsetX("38%")
                .fontColor("black")
                .fontSize(17);

        linearGauge.label(1)
                .useHtml(true)
                .text("F°")
                .position(Position.RIGHT_BOTTOM)
                .anchor(Anchor.RIGHT_BOTTOM)
                .offsetY("20px")
                .offsetX("47.5%")
                .fontColor("black")
                .fontSize(17);

        Base scale = linearGauge.scale()
                .minimum(-30)
                .maximum(40);
//                .setTicks

        linearGauge.axis(0).scale(scale);
        linearGauge.axis(0)
                .offset("-1%")
                .width("0.5%");

        linearGauge.axis(0).labels()
                .format("{%Value}°")
                .useHtml(true);

        linearGauge.thermometer(0)
                .name("Thermometer")
                .id(1);

        linearGauge.axis(0).minorTicks(true);
        linearGauge.axis(0).labels()
                .format(
                        "function () {\n" +
                        "    return '<span style=\"color:black;\">' + this.value + '&deg;</span>'\n" +
                        "  }")
                .useHtml(true);

        linearGauge.axis(1).minorTicks(true);
        linearGauge.axis(1).labels()
                .format(
                        "function () {\n" +
                        "    return '<span style=\"color:black;\">' + this.value + '&deg;</span>'\n" +
                        "  }")
                .useHtml(true);
        linearGauge.axis(1)
                .offset("3.5%")
                .orientation(Orientation.RIGHT);

        Linear linear = Linear.instantiate();
        linear.minimum(-20)
                .maximum(100);
//                .setTicks
        linearGauge.axis(1).scale(linear);

        anyChartView.setChart(linearGauge);
    }
}

我希望温度计随着生成的每个数字而变化,但是只有在我关闭应用程序并再次进入时,温度计才会更改值

1 个答案:

答案 0 :(得分:0)

您提到需要关闭应用程序以更新温度计。这是因为onCreate每次打开应用程序都会被调用。

Timer应该可以工作。也许您使用的Timer错误。这应该定期更新您的温度计。

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() { // you should only update UI in the main/ui thread
                    @Override
                    public void run() {
                        // do your updating here
                    }
                });
            }
        }, 16, 16); // 60 fps