2013-12-13 111 views
0

在我的PreferenceActivity中,我實現了OnPreferenceChangeListener。在onPreferenceChange函數中,我在持久化該值之前對web服務進行驗證。我嘗試使用AsyncTask.get(),但似乎並沒有強制主線程在返回之前等待。有任何想法嗎?我需要在本地進行驗證嗎?在返回值之前等待AsyncTask完成

@Override 
public boolean onPreferenceChange(final Preference preference, final Object value) 
{ 
    new WebServiceCall() 
    { 
     @Override 
     protected void onPostExecute(final SoapObject result) 
     { 
      if (result == null) 
      { 
       mSuccess = false; 
       return; 
      } 

      mSuccess = true; 
      setSummary(preference, value); 
     } 
    }.execute(activity, WEBFUNCTION, selected_ids).get(); 

    return mSuccess; 
} 
+4

這沒有任何意義。 AsyncTask是* asynchronous *。在我建議移動AsyncTask的代碼之前,你絕對不應該在主線程上執行網絡任務。你現在有什麼問題? – CodingIntrigue

+0

它具有應該在主線程上執行的get函數。問題是我需要在保持值之前使用webservice進行驗證。編輯:我不能有'返回mSuccess'在AsyncTask完成之前發生。 – ashishduh

+0

在onPostExecute()運行後繼續執行。這就是該方法的用處。 – NickT

回答

2

您的問題存在一個概念性問題。 據我所知,「onPreferenceChange」在主線程中運行。任何嘗試在該方法內「等待」都會導致用戶界面凍結。您可以通過在onPreferenceChange()中使用以下代碼休眠10秒來驗證我​​的假設。

public boolean onPreferenceChange(final Preference preference, final Object value){ 
    try{ 
     Thread.sleep(10000); 
    }catch(InterruptedException e){ 
     // do nothing 
    } 

    return true; 
} 

據我所知,有兩種選擇達到你想要的東西:

1:你讓喜好變動即暫時通(總是返回true),獨立於它的validity.But你觸發WebServiceCall在onPreferenceChange中。你只是不要等待它完成。 只要您的WebServiceCall完成,您將恢復用戶首選項更改以防萬一它無效。您應該通知用戶恢復其變更。如果您可以假設在大多數情況下,更改將是有效的,則此選項很有意義。

2:您創建了允許用戶更改相關設置的自定義活動。你可以打電話給你的WebService。您應該在運行時顯示ProgressBar。當您的通話返回時,您知道更改是否有效。只有在此之後,您才能將更改提交給SharedPreferences。

相關問題