2013-12-13 3 views
0

PreferenceActivityOnPreferenceChangeListener을 구현 중입니다. onPreferenceChange 함수에서 값을 유지하기 전에 웹 서비스에 대해 유효성을 검사합니다. 나는 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는 * 비동기 *입니다. AsyncTask의 * out * 코드를 옮기기를 제안하기 전에, 메인 스레드에서 네트워크 작업을해서는 안됩니다. 지금 가지고있는 것에 무엇이 잘못 되었습니까? – CodingIntrigue

+0

메인 스레드에서 실행될 get 함수가 있습니다. 문제는 값을 유지하기 전에 webservice를 사용하여 유효성을 검사해야한다는 것입니다. 편집 : AsyncTask가 완료되기 전에'return mSuccess'가 발생할 수 없습니다. – ashishduh

+0

onPostExecute()가 실행 된 후에도 유지하십시오. 그것이 그 방법이있는 곳입니다. – NickT

답변

2

질문에 개념적으로 문제가 있습니다. 내가 아는 한 "onPreferenceChange"는 주 스레드에서 실행됩니다. 이 메서드 내에서 '대기'하려는 시도는 고정 된 사용자 인터페이스로 이어집니다. 다음 코드를 사용하여 onPreferenceChange()에서 10 초 동안 자면서 내 가정을 확인할 수 있습니다.

1 : 두 당신이 원하는 것을 달성하기 위해 옵션이 내 지식

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

    return true; 
} 

, 당신은 설정 변경이 temporarly (항상 true 반환) 통과하자, 그 validity.But의 독립 당신은 WebServiceCall를 트리거 onPreferenceChange에서. 당신은 단지 그것이 끝날 때까지 기다리지 않아도됩니다. WebServiceCall이 완료 되 자마자 사용자 환경 설정이 유효하지 않은 경우 되돌릴 수 있습니다. 사용자에게 변경 사항 되돌리기에 대해 알려야합니다. 대부분의 경우 변경 사항이 유효하다고 가정 할 수있는 경우이 옵션이 적합합니다.

2 : 사용자가 관련 설정을 변경할 수있는 사용자 지정 활동을 작성합니다. 거기에서 WebService를 호출 할 수 있습니다. ProgressBar가 실행되는 동안 표시해야합니다. 전화가 오면 변경 사항이 유효한지 여부를 알 수 있습니다. 그 후에 만 ​​SharedPreferences에 변경 사항을 적용합니다.

관련 문제