2011-08-18 11 views
1

.net 웹 서비스를 통해 사용자 이름 가용성을 확인하는 활동이 있습니다. 전화를받는 동안 "잠시 기다려주십시오"메시지를 표시해야합니다. AsyncTask 및 Threading으로 실험했지만 문제는 다른 로직을 처리하는 결과에 따라 웹 서비스 호출이 완료 될 때까지 실제로 스레드를 차단하려는 것입니다.웹 서비스 호출 중에 '기다려주십시오'표시하십시오.

나는 allsorts를 시도했지만 기쁨이 없습니다. 아무도 도와 줄 수 있습니까?

공공 부울 UsernameIsAvailable (:

private OnClickListener RegistrationListener = new OnClickListener() { 
    public void onClick(View v) { 
     ClearFieldHighlighting(); 
     if (ValidateData()) { 
      if (IsOnline()) { 
       if (UsernameIsAvailable()) { 
        try { 
         iNETUserID = CreateOnlineUser(); 
        } catch (Exception e) { 
        } 

..more 코드 .. 여기

}

은 'UsernameIsAvailable'기능이다 : 요청으로

, 여기에 내 코드의 섹션입니다) {

Boolean bUsernameIsAvailable = false; 

    SoapObject request = new SoapObject(TA.sNAMESPACE, 
      TA.METHOD_IsUsernameAvailable); 
    request.addProperty("sUsername", sEmail); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
      SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(request); 
    HttpTransportSE androidHttpTransport = new HttpTransportSE(
      TA.WEBSERVICES_URL); 

    try { 
     androidHttpTransport.call(TA.SOAP_ACTION_IsUsernameAvailable, 
       envelope); 
     SoapObject thisresponse = (SoapObject) envelope.bodyIn; 

     for (int i = 0; i < thisresponse.getPropertyCount(); i++) { 
      Object obj = thisresponse.getProperty(i); 
      SoapPrimitive soapPrimitive = (SoapPrimitive) obj; 
      bUsernameIsAvailable = Boolean.parseBoolean(soapPrimitive 
        .toString()); 
     } 
    } catch (Exception e) { 
    } 

    return bUsernameIsAvailable; 
} 

나는 KSoap2 w HICH 웹 서비스 물건을

감사 마이크

+0

덕분에 나는 이해한다 나는 블록 안 UI 스레드, 그냥해야합니다!여기 내 코드의 섹션 : 개인 OnClickListener를 RegistrationListener는 = 새로운 OnClickListener를() { \t \t 공공 무효 온 클릭 (보기 V) { \t \t \t ClearFieldHighlighting(); \t \t \t 경우 (ValidateData()) {\t \t \t \t 경우 (IsOnline()) {\t \t \t \t \t (UsernameIsAvailable()) { \t \t \t \t \t \t 시도 { \t \t \t \t 경우 \t \t \t iNETUserID = CreateOnlineUser(); \t \t \t \t \t \t} 캐치 (예외 전자) { \t \t \t \t \t \t} 그것은 그것이 내가 계속해야하는 부울 결과를 반환으로 문제를 일으키는 UsernameIsAvailable에 대한 호출입니다! – Mike

답변

2

당신은 다음과 같은 방법으로 코드를 구조화 할 수 있습니다

private class MyBackgroundTask extends AsyncTask<Void, Void, Void> { 
    protected void onPreExecute() { 
     // show dialog 
    } 
    protected Void doInBackground(Void... unused) { 
     // background processing 
    } 
    protected void onPostExecute(Void unused) { 
     // dismiss dialog 
     continueProcessing(); 
    } 
} 

private OnClickListener RegistrationListener = new OnClickListener() { 
    public void onClick(View v) { 
     // non-blocking code 

     new MyBackgroundTask().execute(); 
    } 
} 

public void continueProcessing() { 
    // the rest of the main activity 
} 
2

혹시 이제까지 메인 UI 스레드를 차단해서는 안를 처리하기 위해 외부 jar 파일입니다. 무슨 일이 일어나고 있는지에 대한 메시지가 담긴 대화 상자를 보여주십시오. 사용자가 대화 상자를 닫을 수 없는지 확인하십시오. AsyncTask 또는 runnable이 작업을 마자 마자 대화 상자를 닫습니다.

사용 DialogsetCancelable (false)를 사용자가 닫을 수 있는지 확인하는 대화

+0

내가 +1했는데'setCancelable (false) '를 사용하는 것이 유용성에 좋지 않다고 생각합니다. 응용 프로그램은 사용자가 참을성이 없어지면 요청을 취소 할 수 있어야합니다. 더 나은 접근법은 일종의 진행 지표를 보여 주어 __something__이 발생했다는 피드백이있는 것입니다. –

+0

asynctask를 사용하여 이미이 문제를 해결했습니다. 웹 서비스 호출이 실행되는 동안 주 코드가 계속 실행됩니다. – Mike

+0

"메인 코드"가 'AsyncTask'가 완료 될 때까지 대기하도록 애플리케이션을 코딩합니다. Kevin이 말했듯이 UI 스레드는 사용자가 응답하지 않게하기 때문에 차단해서는 안됩니다. 일부 코드를 게시하면보다 구체적인 도움을 드릴 수 있습니다. –