2016-11-06 20 views
-2

我知道在android中已經有一些關於全局方法和變量的問題,但我遇到了靜態方法的問題,可能是由於我對面向對象編程的經驗不足。所以這裏是我想要的:在android中的所有活動中使用方法

我正在寫一個應用程序,計算用戶可以爲他做的某些事情賺取的積分。因此,我想從不同的活動和服務調用方法addPoints。該方法還應該在主要活動和其他一些事情中設置點textview。

我通過在MainActivity中添加一個靜態變量

static int sPoints; 

,我在每個活動的「全局」變量使用意識到這點。 但是,與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它必須返回新的點數?還是有另一種方式(我希望如此,因爲上述兩種方式看起來都不太令人滿意)。

+0

我看到一個參數'Context context'被傳遞,我確信你不知道它是已經運行的主要活動的實例。只需創建一個界面並調用它來更新文字瀏覽 –

+0

您可以嘗試將該值放入共享首選項中,並在需要時進行查詢。 Android在後臺執行所有骯髒的工作,並且它不是非常昂貴。 –

+0

嗨,你可以使用匕首的朋友。這裏是公共方法的例子,我不是靜態的請參閱https://github.com/saveendhiman/SampleApp/blob/master/app/src/main/java/com/sampleapp/utils/AppUtils.java – Saveen

回答

0

a。如果您的工作無法通過ShardPreferences完成,並且需要在多個類中使用相同的代碼(如您的情況),則可以安全地使用靜態方法。 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; 
    } 
+0

謝謝,這有很大幫助。如果從通知中調用addPoints,是否還有一種方法可以更改正在運行的MainActivity的textViews? – ptaeuber

+0

通知在服務上運行,服務和活動之間的通信通過廣播接收器完成。據我所知,從服務調用接口是不安全的。所以通過廣播接收機,可能會有所幫助 –