在我的匿名内部类中访问变量的干净方法是什么?

时间:2013-11-17 02:50:29

标签: java parse-platform

我发现了我的问题的重复,但它们都不适合我,我找不到一个干净的答案。我已经尝试将分数传递给另一种设置分数的方法,并且还将对象传递给另一种设置分数的方法,但它们都不起作用。无论我做什么,每次得分都是“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()将为您提供相同的功能,而不是异步调用

2 个答案:

答案 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()