2011-08-18 83 views
1

我有一項活動,通過.net網絡服務檢查用戶名可用性,我需要在通話期間顯示「請稍候」信息,因爲它可能需要一兩秒鐘 - 我有嘗試使用AsyncTask和線程,但我遇到的問題是,我實際上想阻止主要(並且僅)線程,直到Web服務調用完成,因爲我依賴於處理其他邏輯的結果。在網絡服務呼叫期間顯示「請稍候」

我嘗試過allsorts但沒有快樂 - 任何人都可以幫忙嗎?

按照要求,這裏是我的代碼段:

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

..更多代碼.. }

這裏是 'UsernameIsAvailable' 功能:

公共布爾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是一個外部的jar文件來處理Web服務的東西

感謝 邁克

+0

感謝,我明白我不應該塊UI線程,我只需要!這裏是我的代碼段: 私人OnClickListener RegistrationListener =新OnClickListener(){ \t \t公共無效的onClick(視圖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線程。只需顯示一個對話,並提供有關正在發生的事情的信息。確保用戶不能關閉對話框。只要AsyncTask或runnable完成其任務,就關閉對話框。

使用DialogsetCancelable(假),以確保用戶不能關閉對話框

+0

I + 1'd,但我不認爲使用'setCancelable(false)'對可用性有好處。如果用戶不耐煩,應用程序應該能夠取消請求。一個更好的方法是展示某種進度指示器,以便有反饋表明__something__正在發生。 –

+0

我已經嘗試過使用asynctask - 我的主代碼在Web服務調用運行時繼續執行 - 我不希望發生這種情況! – Mike

+0

您對應用程序進行編碼,以便您的「主代碼」等待「AsyncTask」完成。像凱文說的,你不應該阻止UI線程,因爲它會讓你的應用程序對用戶沒有反應。如果您發佈了一些代碼,我們可以提供更具體的幫助。 –