2012-10-23 48 views
2

我有一個應用程序調用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); 

回答

4

你需要,而不是如果onCreate()與共享的喜好做onPostExecute()什麼都。如果你願意,可以禁用你要更新的控件,或者顯示一個進度對話框,或者其他的同時。

更新:而且我應該補充一點,我已經看到了具有共享偏好的奇怪東西。提交後,我看到直接讀取結果錯誤。不要將共享首選項用作活動中的溝通方式。改爲設置(實例)變量並調用回調。

+0

謝謝您認爲我錯誤地使用了sharedpreferences?該應用的性質如下。這是一個應用程序,將推出到同一行業的所有公司。每家公司都有一些名爲公司選項的東西,這是一種向每家公司傾訴應用程序的方式。所以當你第一次安裝應用程序時,會輸入一個公司ID,並且webservice會獲取該公司的選項。該應用程序然後以坦誠的方式行事。我能否以這種方式使用公司選項?該應用程序有可能15活動,閱讀這些選項,所以我需要在全球範圍 – turtleboy

+0

設置變量我所看到的問題是壓力測試過程中的一種方式,並不會導致「真實」的問題。特別是在你的情況下,因爲你不改變共享偏好的價值。但是,我只會使用共享首選項在執行之間在本地存儲狀態。您可以考慮替代方式將這些設置存儲在自定義應用程序對象中。這很容易從所有活動中獲得。 –

+0

好的,我認爲這是sharedpreferences的一點,以應用程序範圍的方式共享數據?是否可以從應用程序中的任何位置訪問共享首選項? – turtleboy

1

我猜你最後的兩個電話getString()onCreate()返回null,因爲你的AsyncTask尚未完成。這是多線程的異步性質,因此您必須對此進行說明。首先我會移動:

String isSavePassword = appSharedPrefs.getString("20", null); 
isAllowChangeUser = appSharedPrefs.getString("30", null); 

到您的AsyncTask的onPostExecute()。然後,我會將它們視爲無效,無論它們將被使用,顯示一個對話框,表明它們的應用程序尚未準備好,或者在某處停用某個按鈕。