Поделиться и обновить объект между двумя действиями - PullRequest
0 голосов
/ 10 марта 2019

Моя проблема заключается в том, что мои две операции GameActivity и StoreActivity должны иметь одинаковые Player, и каждое изменение Player, внесенное в любую Activity, должно быть видно во всех видах деятельности, но когда я покупаю Upgrade в StoreActivity и измените с StoreActivity состояние объекта до покупки. Player равно Serializable.

OnClickListener из StoreActivity:

        LIST_VIEW.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Upgrade upgrade = (Upgrade)LIST_VIEW.getAdapter().getItem(position);
                if(upgrade.getCost() > player.getMoney()) {
                    LIST_VIEW.getChildAt(position).setEnabled(false);
                } else {
                    player.buyUpgrade(upgrade);
                    CURRENT_MONEY.setText(getString(R.string.current_money) + player.getMoney());
                 //Notify GameActivity, but how?
                }
            }
        });

Ответы [ 3 ]

0 голосов
/ 10 марта 2019

Вы можете привязать свой объект Player к жизненному циклу приложения, расширив класс Application и сохранив там свой экземпляр. Это позволит вам иметь ссылку на него в каждом действии без утечки в течение его жизненных циклов. Вы можете проверить его значение, показать некоторую загрузку и создать обратный вызов, когда он установлен, поэтому о всех действиях можно получать уведомления.

Эта замечательная статья Codepath объясняет, как это сделать.

Ваше основное приложение может выглядеть так:

public class MyCustomApplication extends Application {
  private Player player;
  private ArrayList<WeakReference<OnPlayerSetCallback>> callbacks;

  public void addCallback(WeakReference<OnPlayerSetCallback> callbackRef) {
    this.callbacks.add(callbackRef);
  }

  public void removeCallback(WeakReference<OnPlayerSetCallback> callbackRef) {
    this.callback.remove(callbackRef);
  }

  public void setPlayer(Player player) {
    this.player = player;

    for (WeakReference<OnPlayerSetCallback> callbackRef : callbacks) {
      OnPlayerSetCallback callback = callbackRef.get();
      if (callback == null) {
        // remove invalid callback references (if an activity was destroyed, for example)
        callbacks.remove(callbackRef);
      } else {
        // notify activities that a player was set
        callback.onPlayerSet(player);
      }
    }
  }

  public Player getPlayer() {
    return this.player;
  }

  interface OnPlayerSetCallback {
    Player onPlayerSet();
  }
}

Обновление вашего плеера не должно быть проблемой, так как каждое действие будет использовать один и тот же экземпляр. Однако, если вам нужно обновить пользовательский интерфейс без какого-либо жизненного цикла, чтобы перерисовать его между ними, вы можете создать прослушиватель обновлений в обратном вызове.

0 голосов
/ 14 марта 2019

Вы можете использовать Singleton шаблон проектирования.

Вы создаете один объект из PlayerRepository с полем player , и в вашем приложении вы просто получаетеэто и каждый раз, когда вы хотите, вы меняете его.

    public class PlayerRepository {

    private Player player;

    private static final PlayerRepository ourInstance = new PlayerRepository();

    public static PlayerRepository getInstance() {
        return ourInstance;
    }

    private PlayerRepository() {
    }

    public void setPlayer(Player player)
    {
        this.player=player;
    }
    public Player getPlayer()
    {
        retrun this.player;
    }
}

В вашей деятельности

PlayerRepository playerRepository=PlayerRepository.getInstance();
Player player=playerRepository.getPlayer();
player.buyUpgrade(upgrade);
0 голосов
/ 10 марта 2019

Класс android.app.Activity имеет метод onResume().

Он будет вызываться, когда действие снова взаимодействует с пользователем.

Так идеально для вашего случая использования, потому что, когда пользователь хочет вернуться, GameActivity будет приостановлено и onResume() вызывается.

Вы можете реализовать это так:

public class GameActivity extends AppCompatActivity {
        @Override
        protected void onResume() {
            super.onResume();

            //refreshing changed list items
        }
}
...