我已经查看了类似于在内部类中访问变量的答案。需要被宣布为最终版,但它不能解决我所追求的问题。
我正在使用GraphView绘制来自Google Firebase的检索数据。数据应该是这样的连续线:
但是当我运行该程序时,它会继续这样:
这是我的代码行:
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'是从内部类中访问的,需要 宣布决赛。
我该怎么做才能解决这个问题?任何形式的帮助将不胜感激。 谢谢!
答案 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的编译器编译,您的代码将是有效的。)