2014-08-24 1 views
0

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

У меня есть Activity A и Activity B в Package 1 и Activity A делает Volley вызов и создает список моделей Model X, который содержит несколько простых данных (строк и примитивы). Для очень простого примера, пусть Model X представляет собой новостную статью (поэтому список моделей - это список новостных статей), который содержит заголовок и текст статьи новостей. Activity A содержит список, отображающий название статей. Когда вы нажимаете на элемент в списке, вызывается Activity B и заголовок статьи отображается вверху, а текст статьи показан ниже. Activity B нельзя вызывать нигде, кроме Activity A и только после того, как A получил Model X Теперь предположим, что у нас есть большое количество этих моделей, которые содержат большое количество простых типов, и вы точно не знаете, какие данные из модели Activity B вам нужно знать, что ему нужен Model X, который был найден в Activity A.

«Правильный» шаг, похоже, состоял бы в том, чтобы модели реализовали Parcelable и передали модель в связку для активности. Дело в том, что у меня много моделей с большим количеством данных, и если я смогу сэкономить время, это будет здорово. Я пытался внедрить какой-то общий пакет, и это стало беспорядком. Так вот что я подумал:

Мог Activity A не сохранить модель, выбранную в onItemClick() в качестве защищенного статической переменной Activity B можно использовать без необходимости передавать его в Разделенном расслоении, поскольку, как только модель сделана, это будет единственный экземпляр модели, и модель не будет изменена каким-либо образом, чтобы состояние модели не могло быть нарушено статическим вызовом?

Что-то вроде этого

Activity A

public class A extends Activity implements OnItemClickListener{ 
    private List<X> mModels; 
    protected static X mModel; 
    private SimpleListAdapter mAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     // code 

     if(mModels == null) 
      requestModels(); 
     else 
      buildInitialList(); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View child, int position, long id){ 
     mModel = mAdapter.getItem(position); // <-- returns Model X in list of models 
     startActivity(new Intent(this, B.class)); 
    } 

    /* 
     Some irrelevant code, including requestModels() network call (I have a 
     NetworkManager class that does that, but again it isn't important how it 
     does that, just important how I get my data) as well as building my list. 
    */ 

    // Listener attached to Volley call for response 
    private Listener<ArrayList<Model>> getVolleyListener(){ 
     return new Listener<ArrayList<Model>>(){ 

      @Override 
      public void onResponse(ArrayList<Model> models) { 
       if(models != null){ 
        mModels = models; 
        buildInitialList(); 
       } 
       else 
        closeOnEmptyList(); 
      } 

     }; 
    } 
} 

активность B

public class B extends Activity{ 
    private X mModel; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     //code 

     this.mModel = A.mModel; 
     doSomethingWithModel(); 
    } 

    private void doSomethingWithModel(){ 
     String title = mModel.title; 
     String body = mModel.body; 
     // do something 
    } 
} 

The Model class X will never be used outside of Activity A and Activity B, and every Activity that needs to use a Model of the same type is placed in the same Package. У меня есть ряд классов, которые делают подобные вещи (статьи новостей, популярные вопросы и ответы, детали закона, а также другие общие данные String по большей части). Я могу посылить все, что не является проблемой, я просто не могу сказать, что это неправильно, хотя это кажется ошибочным. Ни одна из данных не нуждается в какой-либо безопасности, и ни одна из моделей не является достаточно большой, чтобы вызвать проблему со статической памятью кучи.

EDIT

Мой случай не совсем уникальное, но несколько необычно. Я в порядке с моими данными, которые нужно отменить при перезапуске приложения. Это означает (насколько мне известно) if I store the Model statically of the protected type in Activity A, there is no way that the Model could be null in Activity B как статическая переменная по-прежнему сохраняется в приложении из неподвижного приостановленного Activity A, либо приложение перезагрузилось, и пользователю нужно будет пройти Activity A, перестраивая наш залп Model, так что Activity B может используйте его также.(Возможная ошибка в логической проверке необходима здесь)

Я действительно понимаю, что волейбол имеет кэш, но я уверен, что он требует правильных заголовков кеша (которые дают код ответа примерно как 304), который я не получаю. Любые вводные данные также оцениваются. И снова я понимаю, что использование статики не совсем идеально, но я действительно пытаюсь понять, почему они не должны использоваться в этом случае, или если это на самом деле одно из их применений.

+0

Где вы загружаете данные в деятельности A? – Simas

+0

@ user3249477 у меня есть сетевой вызов, который получает сделал, он возвращается в слушатель. Я добавлю слушателя только к показу, откуда он идет. – zgc7009

+0

Ах, нетрудно. Я думал, что если данные статичны, вы можете просто сохранить их в базе данных. Затем каждое действие может получить нужные ему элементы из БД. – Simas

ответ

1

Вот хороший блог, объясняющий подробности, но если вы хотите сохранить некоторые данные в статической переменной, лучше всего будет иметь эту переменную в классе аппликации, но есть и недостатки. Например, возможно, что ваша деятельность будет приостановлена, а затем возобновлена ​​с новым экземпляром приложения, и ваши данные исчезнут (так что вызов метода на каком-то объекте может дать вам NPE. Я считаю, что безопаснее использовать либо синтаксический анализ , или сохранить его для общих ресурсов в одном действии и загрузить его в следующем.

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

http://www.developerphil.com/dont-store-data-in-the-application-object/

+0

Основываясь на моем вопросе, это вполне приемлемый ответ. Я пришел к выводу, что моя ситуация настолько уникальна, что в этом случае можно было бы использовать статическую переменную, хотя и не идеальную. Исходя из того факта, что данные, которые я вытягиваю, меняются так часто и так случайным образом, я могу выполнить простую проверку onResume(), например 'if (data == null) repullData();' но опять же это не идеально. Настоящий кикер - это то, что я действительно не хочу постоянных данных (достаточно долго для быстрого просмотра приложений или изменения ориентации экрана), что в лучшем случае встречается редко. Я думаю, что поеду с parcelables, вздох – zgc7009

+0

Спасибо за ответ, это хорошая ссылка. Я собираюсь изменить свой вопрос, но это по-прежнему хороший ответ и хороший читать независимо. – zgc7009