2016-11-06 4 views
-2

Я знаю, что в андроидах уже есть некоторые вопросы о глобальных методах и переменных, но я столкнулся с проблемами со статическими методами, вероятно, из-за моего меньшего опыта с объектно-ориентированным программированием. Итак, вот что я хочу:Использование методов во всех действиях в android

Я пишу приложение, которое подсчитывает очки, которые пользователь может заработать для определенных вещей, которые он делает. Из-за этого я хочу вызвать метод addPoints из разных видов деятельности и услуг. Этот метод также должен указывать текстовое представление точек в основном действии и некоторых других вещах.

я понял, добавив статическую переменную

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 на нем, который должен вернуть новое количество точек? Или есть другой способ (надеюсь, так, потому что оба вышеописанных способов кажутся не очень удовлетворительными).

+0

Я вижу передаваемый параметр «Контекстный контекст», и я уверен, что вы не знаете, что это экземпляр основной активности, которая уже запущена. просто создайте интерфейс и вызовите его для обновления текстовых просмотров. –

+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

Спасибо , что очень помогло. Есть ли способ изменить textViews запущенного MainActivity, если addPoints вызывается из уведомления? – ptaeuber

+0

Уведомления на службе, а связь между сервисом и деятельностью осуществляется через широковещательные приемники. насколько я знаю, вызов интерфейсов из службы небезопасен. поэтому пройдите через широковещательные приемники, может помочь –