Java 在android的所有活动中使用方法
我知道android中已经有一些关于全局方法和变量的问题,但我在使用静态方法时遇到了问题,这可能是因为我对面向对象编程的经验不足。这就是我想要的: 我正在写一个应用程序,它计算用户在做某些事情时可以获得的分数。因此,我想从不同的活动和服务调用方法Java 在android的所有活动中使用方法,java,android,static,instance,Java,Android,Static,Instance,我知道android中已经有一些关于全局方法和变量的问题,但我在使用静态方法时遇到了问题,这可能是因为我对面向对象编程的经验不足。这就是我想要的: 我正在写一个应用程序,它计算用户在做某些事情时可以获得的分数。因此,我想从不同的活动和服务调用方法addPoints。此方法还应在主活动和其他一些内容中设置点textview 我通过添加一个静态变量来实现它 static int sPoints; 在MainActivity中,我将其用作每个活动中的“全局”变量。 然而,使用addPoints方法,
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的文本视图?通知在服务上运行,并且服务和活动之间的通信通过广播接收器完成。据我所知,从服务调用接口是不安全的。所以通过广播接收器,可能会有所帮助