Я разрабатываю приложение, которое требует списка родных контактов. Я использую cursorloader для извлечения контактов и сохранения его в HashMap глобально в моем классе приложенийГлобальная переменная в приложении Android не сохраняется
public class WoofyApp extends Application {
private static WoofyApp mInstance;
private FontFactory fontFactory;
private PreferenceService preferenceService;
private RequestQueue mRequestQueue;
private VolleyService mVolley;
private Validator mValidator;
private NetworkService mNetwork;
private DaoSession daoSession;
private HashMap<String,String> persons;
private ProgressDialog pdLoading;
private UserDao userDao;
private static final String WOOFYAPP = "WOOFYAPP";
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
persons = new HashMap<>();
}
public HashMap<String, String> getPersons(){
return persons;
}
public void setPersons(HashMap<String,String> per){
persons = per;
}
я доступ к списку контактов в соответствующих мероприятиях и фрагментов. И я устанавливаю его в классе ContactService:
public class ContactService implements LoaderManager.LoaderCallbacks<Cursor> {
HashMap<String, String> hmContacts;
ArrayList<Person> alContacts;
private Context mContext;
private EventBus bus;
WoofyApp mApp;
private static final String[] PROJECTION = {
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
};
public ContactService(AppCompatActivity context) {
hmContacts = new HashMap<>();
alContacts = new ArrayList<>();
this.mContext = context;
bus = EventBus.getDefault();
mApp = WoofyApp.getApp();
Log.d(Constants.LIFE_CYCLE,"ContactService called");
if(mApp.getPersons().size()==0){
context.getLoaderManager().initLoader(0,null,this);
if(!context.getLoaderManager().getLoader(0).isReset()) {
context.getLoaderManager().restartLoader(0, null, this);
}
Log.d(Constants.LIFE_CYCLE,"ContactService loader called");
} else{
this.hmContacts = mApp.getPersons();
this.alContacts = hashToArray(hmContacts);
bus.post(hmContacts);
bus.post(new ContactsAdapter(mContext, R.layout.row_contact_child, alContacts));
Log.d(Constants.LIFE_CYCLE,"ContactService persons called");
}
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Log.d(Constants.LIFE_CYCLE,"ContactService onCreateLoader called");
return new CursorLoader(
mContext,
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
PROJECTION,
null,
null,
null
);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (data.getCount() > 0) {
while (data.moveToNext()) {
String name = data.getString(
data.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = Validator.formatNumbers(data.getString(
data.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
if (!hmContacts.containsKey(number)){
alContacts.add(new Person(name, number));
}
hmContacts.put(number, name);
}
Log.d(Constants.LIFE_CYCLE,"onLoadFinished loader called "+hmContacts.size());
mApp.setPersons(hmContacts);
bus.post(hmContacts);
bus.post(new ContactsAdapter(mContext, R.layout.row_contact_child, alContacts));
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
public static ArrayList<Person> hashToArray(HashMap<String,String> hm){
Iterator it = hm.entrySet().iterator();
ArrayList<Person> persons = new ArrayList<>();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
persons.add(new Person((String)pair.getValue(),(String)pair.getKey()));
it.remove();
}
return persons;
}
}
Странной ЧАСТЬ
Когда я получить доступ к нему в первый раз от основной деятельности и ее фрагмента загружающего должным образом. Но когда я пытаюсь получить к нему доступ после возвращения из разных видов деятельности. onResume основной деятельности показывает размер 0. Любые идеи, как это может происходить?