我发现了我的问题的重复,但它们都不适合我,我找不到一个干净的答案。我已经尝试将分数传递给另一种设置分数的方法,并且还将对象传递给另一种设置分数的方法,但它们都不起作用。无论我做什么,每次得分都是“0”。我该怎么办?现在我有:
public class Score {
private int score;
// this is part of my onCreate method but I shortened it for simplication
// get android id
android_id = Secure.getString(getBaseContext().getContentResolver(),
Secure.ANDROID_ID);
// set score
queryScore(android_id);
// print score
System.out.println(score);
// end onCreate method
public void queryScore(String android_id) {
ParseQuery<ParseObject> query = ParseQuery.getQuery("AndroidGame");
query.whereEqualTo("androidID", android_id);
query.getFirstInBackground(new GetCallback<ParseObject>() {
public void done(ParseObject object, ParseException e) {
if (e == null) {
score = object.getInt("playerScore");
// (1) setScore(score);
// (2) setScore(object);
} else {
}
}
});
}
// DOESN'T WORK (1)
public void setScore(int score) {
this.score = score;
}
// DOESN'T WORK (2)
public void setScore(ParseObject po) {
score = po.getInt("playerScore");
}
}
结果是,query.getFirstInBackground()
是一个异步调用。 query.find()
将为您提供相同的功能,而不是异步调用
答案 0 :(得分:1)
我怀疑这个问题与线程有关。看起来你的query.getFirstInBackground
运行另一个在完成时调用done
方法的线程。如果是这种情况,那么当您设置值时,我认为您无法访问score
的同一个实例。
对此的一个解决方案是使score
成为静态成员,然后在done
内对该静态成员进行操作。
答案 1 :(得分:1)
由于问题是从内部匿名类更改类成员值,因此我冒昧地将代码修改为更小,更简单的示例。
public class Score {
private int score;
private class B{
public void done(){
}
}
public Object queryScore(final HashMap<String, Integer> a) {
B b = new B() {
public void done() {
score = a.get("playerScore");
setScore(score);//works
setScore(a);//works
}
};
return b;
}
public void setScore(int score) {
this.score = score;
}
public void setScore(HashMap<String, Integer> po) {
score = po.get("playerScore");
}
public int getScore(){
return score;
}
public static void main(String[] args) {
Score s = new Score();
HashMap<String, Integer> a = new HashMap<String, Integer>();
a.put("playerScore", 3);
B b = (B) s.queryScore(a);
b.done();
System.out.println(s.getScore());
}
}
上面示例中的 - 两个setScore()
方法都有效。
您应该查看getFirstInBackground()
并查看是否在传递的对象上调用了done()
!