I am designing an application which requires native contacts list. I am using cursorloader for retrieving contacts and saving it in hashmap globally in my application class
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; }
I am accessing the contacts list in the relevant activities and fragments. And I am setting it in ContactService class :
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; } }
THE STRANGE PART
When I access it for first time from main activity and its fragment it is loading properly. But when I try to access it after returning from different activity..i.e. onResume of main activity it is showing size 0. Any ideas how this might be happening?