2013-03-04 2 views
0

У меня возникли проблемы с хранением List в классе Application.Совместное использование ArrayList между активностями

В моем экране Splash я загружаю данные в базу данных List из базы данных MySQL.

List находится в классе Rateit, который extends Application. Я делаю это в нем в качестве переменной класса:

public static List<String> masterCats; 

В Splash Screen активность/класса, я делаю это:

в onCreate:

Rateit.masterCats = new ArrayList<String>(); 

Внутри моей петли AsyncTask где загрузка данных Я делаю это:

Rateit.masterCats.add(cat); 

cat является элемент списка тха t поступает из базы данных. У меня есть Log.d данные (cat), а также ListPosition, чтобы проверить, добавляется ли он в List, и это так.

Однако мне нужно получить эту же информацию в следующем Activity и положить ее в adapter. Он возвращается с длиной 0.

Я просто сделать это: adapter = new MasterCatAdapter(getActivity(), Rateit.masterCats, tf);

Каким образом список не сохранять данные по activies? Это потому, что его static? что-то другое?

(Примечание: я буду добавлять методы получения и установки здесь в ближайшее время!)

+3

Не связывайтесь с статические переменные. Оставайтесь с постоянным хранилищем. Даже прохождение через намерения будет работать, если ваш ArrayList невелик. –

+0

Надеюсь, вы не имеете в виду SQLite? Или SharedPreferences лучший вариант? – KickingLettuce

+2

Согласно этому документу, Android ведет себя корректно, когда используются статические переменные: http: //developer.android.com/guide/faq/framework.html Может быть, что-то еще очищает вашу статическую переменную в какой-то момент? –

ответ

2

Как @ A - C упомянул в своем комментарии, избегать модели, теперь статической переменной. Вместо этого, я хотел бы сделать что-то вроде этого:

private void yourMethodWhereYouGetYourData(){ 
    //get your data 
    ArrayList<String> masterCats = new ArrayList<String>(); 
    masterCats.add(cat); 

    //Assuming you're doing this synchronously, once you've gotten your data just do: 
    Intent i = new Intent(this, YourActivity.class); 
    i.putStringArrayListExtra("MasterCats", masterCats); 
    startActivity(i); 
} 

Тогда в ваших новых Activity «ы onCreate() или где бы, просто получить доступ к списку, выполнив:

getIntent().getStringArrayListExtra("MasterCats"); 

@KickingLettuce также упоминается в комментариях о сохраняя это доступным, если пользователь переходит от Activity. Таким образом, в зависимости от того, Activity вы хотите сохранить ArrayList, просто преобразовать его в строку, разделенную запятыми и сохранить его в SharedPreferences так:

private void saveCats(){ 
    //get your ArrayList from wherever (either as a global variable or pass it into the 
    //method. 
    StringBuilder sb = new StringBuilder(); 
    for(int i = 0; i < masterCats.size(); i++){ 
     if(i == masterCats.size() - 1) 
      sb.append(masterCats.get(i)); 
     else 
      sb.append(masterCats.get(i)+","); 
    } 

    SharedPreferences.Editor prefsEditor = 
     PreferenceManager.getDefaultSharedPreferences(this).edit(); 
    prefsEditor.putString("MasterCats", sb.toString()).commit(); 

    //Note: in API 11 and beyond you can store a Set of Strings in SharedPreferences, so 
    //if you are only targeting API 11+ you could do: 
    Set<String> masterCatsSet = new LinkedHashSet<String>(); //<--using LinkedHashSet to preserve order 
    masterCatsSet.addAll(masterCats); 
    prefsEditor.putStringSet("MasterCats",masterCatsSet).commit(); 
} 

Затем этот SharedPreference в вашем onCreate или что-то, если вы хотите, чтобы сохраняться список по всему жизненному циклу Activity.

+0

Мне это нравится, но мне нужно поддерживать эту информацию, пока приложение активно (в случае, если пользователь возвращается к этому действию). Я не верю, что это так? – KickingLettuce

+1

Если вы храните его как глобальную переменную в Activity, считая, что Activity не будет уничтожен, он все равно будет доступен. Если активность действительно разрушена, существует также ряд постоянных параметров хранилища. Я уточню, как бы я мог справиться с этим, чтобы упорствовать в жизненном цикле активности. – dennisdrew

+1

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

1

сохранение списка в приложении расширенного класса хорошая идея, вы можете достичь его, следуя

Список Declare следующим образом в вашем классе App как

public static List<String> masterCats; 

и объявить сеттер и геттер методы выше переменной

public List getMasterCatsList() 
{ 
    return masteCats; 
} 

public Void setMasterCatsList(List list) 
{ 
    masteCats=list; 
} 

получить объект приложения следующим образом: в вашем Loader классе следующим

Приложение application = (YOURClassName, которое расширяет класс приложения) getApplication();

и установить список следующим образом

application.setMasterCatsList(List list); 

теперь вы можете получить доступ к этот список из любой активности следующим

Application application = (YOurClassName That Extends Application class) getApplication(); 

List l = application.getMasterCatsList(); 

надеюсь, что это будет полезно для вас

Смежные вопросы