Так что, в принципе, я не могу поколебать тот факт, что это кажется плохой идеей, но я не могу определить почему.Использование статической переменной для обмена данными между действиями в пакете
У меня есть 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), который я не получаю. Любые вводные данные также оцениваются. И снова я понимаю, что использование статики не совсем идеально, но я действительно пытаюсь понять, почему они не должны использоваться в этом случае, или если это на самом деле одно из их применений.
Где вы загружаете данные в деятельности A? – Simas
@ user3249477 у меня есть сетевой вызов, который получает сделал, он возвращается в слушатель. Я добавлю слушателя только к показу, откуда он идет. – zgc7009
Ах, нетрудно. Я думал, что если данные статичны, вы можете просто сохранить их в базе данных. Затем каждое действие может получить нужные ему элементы из БД. – Simas