0

我正在設計一個需要本地聯繫人列表的應用程序。我使用cursorloader檢索聯繫人和我的應用程序類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; 
} 

我訪問的有關活動和片段的聯繫人列表在全球範圍內的HashMap保存。而且我設置它的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; 
} 
} 

奇怪的部份

當我訪問它首次從主要活動及其片段被正確加載。但是,當我從不同的活動返回後嘗試訪問它時..i.e。 onResume的主要活動顯示大小0.任何想法如何發生這種情況?

回答

0

添加設置你的模型需要:

public class SettingsModel { 
    public String facebookToken; 
    public String twitterToken; 
    //... anything you need 
} 

進行設置服務和初始化它在擴展應用類作爲

new SettingsService(); 

SettingsService:

public class SettingsService { 

    private static String KEY = "yourDesiredSettingsKey"; 
    private static Context mContext; 

    public static SettingsModel settings; 

    public SettingsService(){ 
     mContext = YourApplication.getMainContext(); 
     //if(settings == null){ 
     settings = getSettings(); 
     //} 
    } 

    public static void saveSettings(){ 
     if(settings == null){ 
      settings = new SettingsModel(); 
     } 
     SharedPreferences.Editor editor = mContext 
       .getSharedPreferences(KEY, Activity.MODE_PRIVATE).edit(); 
     Gson gson = new Gson(); 
     String jsonSettings = gson.toJson(settings); 
     editor.putString("settings", jsonSettings); 
     editor.commit(); 
     settings = getSettings(); 
    } 


    public static SettingsModel getSettings() { 
     SharedPreferences editor = mContext.getSharedPreferences(KEY, 
       Activity.MODE_PRIVATE); 
     try{ 
      String jsonSettings = editor.getString("settings","settings"); 
      Gson gson = new Gson(); 
      settings = gson.fromJson(jsonSettings, SettingsModel.class); 
     }catch (Exception e){ 
      settings = new SettingsModel(); 
     } 

     return settings; 
    } 


} 

在gradle這個:

compile 'com.google.code.gson:gson:2.4' 

那一切,你可以從任何地方訪問您的設置有:

String token = SettingsService.settings.facebookToken; 

或更新它們:

SettingsService.settings.facebookToken = "yourToken"; 
SettingsService.saveSettings(); 
0

我it..I用一種方法來轉換hasmap到其中的ArrayList在它中有iterator.remove()。它刪除了聯繫人,並將hashmap留空。對不起,這個愚蠢的問題打擾你。