在返回值之前等待AsyncTask完成

时间:2013-12-13 15:40:16

标签: android

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;
}

1 个答案:

答案 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。