使用android

时间:2016-11-06 03:59:55

标签: java android static instance

我知道在android中已经有一些关于全局方法和变量的问题,但是由于我对面向对象编程的经验不足,我遇到了静态方法的问题。所以这就是我想要的:

我正在编写一个应用程序来计算用户可以为他所做的某些事情赚取的积分。因此,我想从不同的活动和服务中调用方法addPoints。此方法还应在主要活动和其他一些事项中设置点textview。

我通过添加静态变量

来实现它
static int sPoints;
在MainActivity中的

,我用作"全球"每个活动中的变量。 但是,使用addPoints方法我遇到了一些问题。如果我使用非静态方法,我必须在其他活动中创建一个MainActivity实例,这不是很好,并且更改该实例的值不会对实际的MainActivity产生影响。

如果我使用静态函数,只要我不想使用非静态方法,就可以正常工作:

public static void addPoints(Context context, int points){
    int levelBefore, levelAfter;

    levelBefore = getLevelFromPoints(sPoints);
    sPoints = sPoints + points;
    levelAfter = getLevelFromPoints(sPoints);

    if(levelBefore!=levelAfter){
        String rank = getRankFromLevel(levelAfter);
        levelTextView.setText("Lvl. " + String.valueOf(levelAfter));
        Toast.makeText(context, "Congrats! You reached the next level!", Toast.LENGTH_LONG).show();
    }
}

在这里,我无法轻松使用levelTextView.setText,在许多其他情况下我遇到了这个问题。而且,无论如何,我已经读到使用静态方法并不好。

那么每次创建MainActivity实例的正确方法是什么,然后在其上调用addPoints,它必须返回新的点数?还是有另一种方式(我希望如此,因为上述两种方式似乎都不太令人满意)。

1 个答案:

答案 0 :(得分:0)

一个。静态方法可以安全地用于ShardPreferences无法完成您的工作,并且需要在多个类中使用相同的代码,例如您的情况。 湾首先创建一个接口,将更新的排名传递给相应的活动或类

public interface ScoreUpdater {
    void updateScore (String rank);
}

℃。然后在需要使用的所有活动中实现它,在这种情况下是MainActivity

public class MainActivity extends AppCompatActivity implements ScoreUpdater{
     //
    //other methods and codes
   //
    @Override
    public void updateScore(String rank) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                levelTextView.setText("Lvl. " + String.valueOf(levelAfter));
                Toast.makeText(MainActivity.this.getApplicationContext(), "Congrats! You reached the next level!", Toast.LENGTH_LONG).show();
            }
        });
    }
}

d。然后实现你的静态方法。不知道你在哪里声明了几个变量。所以下面的方法是猜测工作。

public static void addPoints(Context context, int points){
        //not sure where you are declaring sPoints
        int levelBefore, levelAfter;
        levelBefore = getLevelFromPoints(sPoints);
        sPoints = sPoints + points;
        levelAfter = getLevelFromPoints(sPoints);

        if(levelBefore!=levelAfter){
            String rank = getRankFromLevel(levelAfter);
            if(context instanceof ScoreUpdater){
                ((ScoreUpdater)context).updateScore(rank);
            }
        }
    }

    private static int getLevelFromPoints(int points){
        //your operations
        return points;
    }