变量是从内部类中访问的,需要声明为final

时间:2018-05-17 11:32:57

标签: java android firebase firebase-realtime-database android-graphview

我已经查看了类似于在内部类中访问变量的答案。需要被宣布为最终版,但它不能解决我所追求的问题。

我正在使用GraphView绘制来自Google Firebase的检索数据。数据应该是这样的连续线:

enter image description here

但是当我运行该程序时,它会继续这样:

enter image description here

这是我的代码行:

public class RetrieveApp extends AppCompatActivity {

Integer hrValue;
ArrayList<Integer> array2; //array to contain hrValue
private ListView mListView;
LineGraphSeries<DataPoint> series ;



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

    GraphView graph = (GraphView)findViewById(R.id.graph);
    series = new LineGraphSeries<DataPoint>();

    DatabaseReference userdatabase = FirebaseDatabase.getInstance().getReference().child("Users");
    auth = FirebaseAuth.getInstance();
    user = auth.getCurrentUser();

    DatabaseReference ref = userdatabase.child(user.getUid());

    array2 = new ArrayList<>(); //array untuk hr



    //RETRIEVE DATA HR VALUE 
    ref.child("hrvalue").child("nilaihr").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            hrValue = dataSnapshot.child("tmpHR").getValue(Integer.class);
            showData(dataSnapshot);
            double y,x ;
            x = 0.0;
GraphView graph = (GraphView)findViewById(R.id.graph);
        series = new LineGraphSeries<DataPoint>();
            for (int i=0; i<1000; i++){
                x = x+i;
                y = hrValue;
                series.appendData(new DataPoint(x, y), true, 1000);
            }
            graph.addSeries(series);
        }

每当我尝试将这两行移动到onCreate时,

GraphView graph = (GraphView)findViewById(R.id.graph);
        series = new LineGraphSeries<DataPoint>();

graph.addSeries(series)行继续告诉我:

  

变量'graph'是从内部类中访问的,需要   宣布决赛。

我该怎么做才能解决这个问题?任何形式的帮助将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

基本上,您需要执行您应该执行的错误消息暗示。将graph声明为final。像这样:

protected void onCreate(Bundle savedInstanceState) {

    ...

    final GraphView graph = (GraphView)findViewById(R.id.graph);

    ...

    ref.child("hrvalue").child("nilaihr").addChildEventListener(
        new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                ...

                graph.addSeries(series);
            }
        });
     ...

规则(在Java 8之前)是内部类只能使用在封闭范围内声明的局部变量(如graph是...)如果变量声明为{{1 }}

在Java 8中,他们放宽了这条规则。现在变量只需要在捕获它的时候有效地最终。 (如果使用兼容Java 8的编译器编译,您的代码将是有效的。)

相关问题