在PreferenceActivity
我正在实施OnPreferenceChangeListener
。在onPreferenceChange
函数中,我在持久保存值之前验证了Web服务。我尝试使用AsyncTask.get()
但似乎并没有强迫主线程在返回之前等待。有任何想法吗?我必须在本地验证吗?
@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;
}
答案 0 :(得分: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),与其有效性无关。但是你在onPreferenceChange中触发了WebServiceCall。你只是等不及它完成。 一旦您的WebServiceCall完成,您将恢复用户首选项更改,以防它无效。您应该通知用户恢复他的更改。如果您可以假设在大多数情况下,更改将是有效的,则此选项有意义。
2:您构建了一个自定义活动,允许用户更改相关设置。在那里你可以调用你的WebService。您应该在ProgressBar运行时显示它。当您的呼叫返回时,您知道更改是否有效。只有在那之后,才将更改提交给SharedPreferences。