Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android的所有活动中使用方法_Java_Android_Static_Instance - Fatal编程技术网

Java 在android的所有活动中使用方法

Java 在android的所有活动中使用方法,java,android,static,instance,Java,Android,Static,Instance,我知道android中已经有一些关于全局方法和变量的问题,但我在使用静态方法时遇到了问题,这可能是因为我对面向对象编程的经验不足。这就是我想要的: 我正在写一个应用程序,它计算用户在做某些事情时可以获得的分数。因此,我想从不同的活动和服务调用方法addPoints。此方法还应在主活动和其他一些内容中设置点textview 我通过添加一个静态变量来实现它 static int sPoints; 在MainActivity中,我将其用作每个活动中的“全局”变量。 然而,使用addPoints方法,

我知道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
,它必须返回新的点数吗?或者还有别的方法吗(我希望如此,因为上述两种方法似乎都不太令人满意)。如果您的工作无法通过
shardReferences
完成,并且需要在多个类中使用相同的代码,则可以安全地使用静态方法。
B首先创建一个接口,将更新后的排名传递给相应的活动或类

public interface ScoreUpdater {
    void updateScore (String rank);
}
c。然后在需要使用的所有活动中实现它,在本例中为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;
    }

我看到传递了一个参数
Context
,我很确定您不知道它是已经运行的主活动的实例。只需创建一个接口并调用它来更新文本视图。您可以尝试将该值放入共享首选项中,并在需要时查询它。安卓在后台做所有的脏活,而且也不太贵。嗨,朋友,你可以用dagger。这里是公共方法的示例,我不会让它成为静态的。谢谢,这很有帮助。如果从通知中调用addPoints,是否还有方法更改正在运行的MainActivity的文本视图?通知在服务上运行,并且服务和活动之间的通信通过广播接收器完成。据我所知,从服务调用接口是不安全的。所以通过广播接收器,可能会有所帮助