我有一個應用程序調用Web服務並retreives contentValue對象。該對象將填充最終以SharedPreferences存儲的字符串字符串值。我已經使用AsyncTask來使Web服務調用不阻塞UI線程。 Web服務確實填充CV對象。如何停止應用程序執行,直到AsyncTask已填充SharedPreferences
問題在於我嘗試使用sharedpreferences中的值。共享首選項對象爲空。該應用程序試圖在AsyncTask實例化並填充之前使用此對象。如何讓應用程序等待,直到AsyncTask完成?
CompID是作爲參數傳遞給webservice的字符串。如果應用程序第一次安裝時,此變量爲空,我顯示一個對話框要求用戶輸入compID。
if(nfcscannerapplication.getCompId() == null ||
nfcscannerapplication.getCompId().trim().equalsIgnoreCase("null")){
Log.e(TAG, "compid null***********");
showPasswordDialogBox();
}
ShowPasswordDialogBox(不恰當地命名)獲取compID並將其傳遞給asyncCompOpt()。
public void asyncCompOpt(){
String[] paramsCompOpt = new String[]{nfcscannerapplication.getCompId()};
AsyncGetCompanyOptions agco = new AsyncGetCompanyOptions();
agco.execute(paramsCompOpt);
}
asyncCompOpt調用AsyncTask。
private class AsyncGetCompanyOptions extends AsyncTask<String, Void, ContentValues> {
ProgressDialog progressDialog;
@Override
protected void onPreExecute()
{
progressDialog = ProgressDialog.show(EntryActivity.this,
"Connecting to Server"," Getting your company's options...", true);
};
@Override
protected ContentValues doInBackground(String... params) {
ContentValues cv = null;
try {
Log.e(TAG, "inside doInBackground");
cv = loginWebservice.getCompanyOptionsAndPhonenumbers(nfcscannerapplication.getCompId());
if(cv == null){
Log.e(TAG, "cv is null");
}else{
Log.e(TAG, "cv is not null");
}
} catch (Exception e) {
e.printStackTrace();
}
return cv;
}
@Override
protected void onPostExecute(ContentValues result)
{
super.onPostExecute(result);
if(progressDialog != null)
progressDialog.dismiss();
String tagTouchInterval = (String) result.get("10");
Log.e(TAG, "tagTouchInterval in onpostexecute = " + tagTouchInterval);
String savePassword = (String) result.get("20");
String allowChangeUser = (String) result.get("30");
String displayRotaDetails = (String) result.get("40");
String displayClientPhoneNumber = (String) result.get("50");
String displayClientKeysafe = (String) result.get("60");
String displayDoubleupCarer = (String) result.get("70");
String displayContacts = (String) result.get("80");
String autoLogout = (String) result.get("90");
String displayNotesDisplayNotes = (String) result.get("100");
String displayMeds = (String) result.get("110");
String rotaLogout = (String) result.get("120");
String displayActualTime = (String) result.get("130");
String qrcodeEnabled = (String) result.get("140");
String manualInput = (String) result.get("150");
String rotasOnly = (String) result.get("160");
appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(EntryActivity.this.getApplicationContext());
prefsEditor = appSharedPrefs.edit();
prefsEditor.putString("10", tagTouchInterval);
prefsEditor.putString("20", savePassword);
prefsEditor.putString("30", allowChangeUser);
prefsEditor.putString("40", displayRotaDetails);
prefsEditor.putString("50", displayClientPhoneNumber);
prefsEditor.putString("60", displayClientKeysafe);
prefsEditor.putString("70", displayDoubleupCarer);
prefsEditor.putString("80", displayContacts);
prefsEditor.putString("90", autoLogout);
prefsEditor.putString("100", displayNotesDisplayNotes);
prefsEditor.putString("110", displayMeds);
prefsEditor.putString("120", rotaLogout);
prefsEditor.putString("130", displayActualTime);
prefsEditor.putString("140", qrcodeEnabled);
prefsEditor.putString("150", manualInput);
prefsEditor.putString("160", rotasOnly);
prefsEditor.commit();
}//end of postExecute
我會發布oncreate的一部分,以便您可以看到事物的流程。該應用程序正試圖在Async完成之前訪問SharedPreferences。我怎樣才能解決這個問題?謝謝。
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
nfcscannerapplication = (NfcScannerApplication) getApplication();
sIs = savedInstanceState;
if(nfcscannerapplication.getCompId() == null ||
nfcscannerapplication.getCompId().trim().equalsIgnoreCase("null")){
Log.e(TAG, "compid null***********");
showPasswordDialogBox();
}
setContentView(R.layout.entryscreen);
//loginWebservice = new LoginWebservice(this);
loginWebservice = nfcscannerapplication.loginWebservice;
userName = (EditText)findViewById(R.id.username);
passwordPin = (EditText)findViewById(R.id.password);
String isSavePassword = appSharedPrefs.getString("20", null);
isAllowChangeUser = appSharedPrefs.getString("30", null);
謝謝您認爲我錯誤地使用了sharedpreferences?該應用的性質如下。這是一個應用程序,將推出到同一行業的所有公司。每家公司都有一些名爲公司選項的東西,這是一種向每家公司傾訴應用程序的方式。所以當你第一次安裝應用程序時,會輸入一個公司ID,並且webservice會獲取該公司的選項。該應用程序然後以坦誠的方式行事。我能否以這種方式使用公司選項?該應用程序有可能15活動,閱讀這些選項,所以我需要在全球範圍 – turtleboy
設置變量我所看到的問題是壓力測試過程中的一種方式,並不會導致「真實」的問題。特別是在你的情況下,因爲你不改變共享偏好的價值。但是,我只會使用共享首選項在執行之間在本地存儲狀態。您可以考慮替代方式將這些設置存儲在自定義應用程序對象中。這很容易從所有活動中獲得。 –
好的,我認爲這是sharedpreferences的一點,以應用程序範圍的方式共享數據?是否可以從應用程序中的任何位置訪問共享首選項? – turtleboy