2013-05-24 2 views
0

Я хочу показать ProgressDialog, когда вызов вызова веб-службы производится, это мой код:Показаны ProgressDialog на AsyncThread Android

public class penAPIController extends AsyncTask<Object, Void, Object>{ 

private View view; 
private ProgressDialog dialog; 

public penAPIController(View v) 
{ 
    view = v; 
} 
    protected void onPreExecute() 
    { 
     this.dialog = new ProgressDialog(view.getContext()); 
     this.dialog.setMessage("Loading, Please Wait.."); 
     this.dialog.setCancelable(false); 
     this.dialog.show(); 
    } 

Диалог действительно показывает, но только после того, как doInBackground закончена, я хочу чтобы показать его, пока doInBackground выполняет свою работу. А затем скрыть его PostExecute

onPostExecute:

@Override 
     protected void onPostExecute(Object obj) 
     { 
      //dialog.dismiss(); 
      myMethod(obj); 
     } 

    private Object myMethod(Object myValue) 
    { 
     //handle value 
     return myValue; 
    } 

doInBackground:

@Override 
     protected Object doInBackground(Object... objects) 
     { 
      if(objects.length < minNumberOfParams) 
      { 
       return null; 
      } 
      Object finalObject = null; 
      // TODO Auto-generated method stub 
      String NAMESPACE = "http://..."; 
      String METHOD_LOGIN_NAME = "Login"; 
      String SOAP_LOGIN_ACTION = "http://..."; 
      String METHOD_RUNACTION_NAME = "RunAction"; 
      String SOAP_RUNACTION_ACTION = "http://..."; 
      String CLIENT = (String)objects[0]; 
      String APPLICATION = (String)objects[1]; 
      String USERNAME = (String)objects[2]; 
      String PASSWORD = (String)objects[3]; 
      String URL = (String)objects[4]; 
      String ACTION_NAME = (String)objects[5]; 
      ArrayList arrayParams = null; 
      if(objects.length == (minNumberOfParams + 1)) 
      { 
       arrayParams = (ArrayList)objects[6];//Build parameters xml from ActionParam array 
      } 
      String PARAMETERS = buildParametersXML(arrayParams); 

      SoapObject Request = new SoapObject(NAMESPACE, METHOD_LOGIN_NAME); 

      //Client 
      PropertyInfo propertyClient = new PropertyInfo(); 
      propertyClient.setName("client"); 
      propertyClient.setValue(CLIENT); 
      propertyClient.setType(CLIENT.getClass()); 
      Request.addProperty(propertyClient); 
      //Application 
      PropertyInfo propertyApplication = new PropertyInfo(); 
      propertyApplication.setName("application"); 
      propertyApplication.setValue(APPLICATION); 
      propertyApplication.setType(APPLICATION.getClass()); 
      Request.addProperty(propertyApplication); 
      //Username 
      PropertyInfo propertyUsername = new PropertyInfo(); 
      propertyUsername.setName("username"); 
      propertyUsername.setValue(USERNAME); 
      propertyUsername.setType(USERNAME.getClass()); 
      Request.addProperty(propertyUsername); 
      //Password 
      PropertyInfo propertyPassword = new PropertyInfo(); 
      propertyPassword.setName("password"); 
      propertyPassword.setValue(PASSWORD); 
      propertyPassword.setType(PASSWORD.getClass()); 
      Request.addProperty(propertyPassword); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(Request); 

      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
      try 
      { 
       androidHttpTransport.call(SOAP_LOGIN_ACTION, envelope); 
       SoapPrimitive response = (SoapPrimitive)envelope.getResponse(); 
       String token = response.toString(); 

       SoapObject RequestRun = new SoapObject(NAMESPACE, METHOD_RUNACTION_NAME); 

       //Token 
       PropertyInfo propertyToken = new PropertyInfo(); 
       propertyToken.setName("token"); 
       propertyToken.setValue(token); 
       propertyToken.setType(token.getClass()); 
       RequestRun.addProperty(propertyToken); 
       //Action Name 
       PropertyInfo propertyAction = new PropertyInfo(); 
       propertyAction.setName("actionName"); 
       propertyAction.setValue(ACTION_NAME); 
       propertyAction.setType(ACTION_NAME.getClass()); 
       RequestRun.addProperty(propertyAction); 
       //Parameters 
       PropertyInfo propertyParams = new PropertyInfo(); 
       propertyParams.setName("parameters"); 
       propertyParams.setValue(PARAMETERS); 
       propertyParams.setType(PARAMETERS.getClass()); 
       RequestRun.addProperty(propertyParams); 

       SoapSerializationEnvelope envelopeRun = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
       envelopeRun.dotNet = true; 
       envelopeRun.setOutputSoapObject(RequestRun); 
       HttpTransportSE androidHttpTransportRun = new HttpTransportSE(URL); 
       androidHttpTransportRun.call(SOAP_RUNACTION_ACTION, envelopeRun); 
       SoapPrimitive responseRun = (SoapPrimitive)envelopeRun.getResponse(); 
       String result = responseRun.toString(); 
       finalObject = parseOutputXML(result); 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
      return finalObject; 
      } 
+1

так в чем проблема? переопределить onPostExecute и отменить диалог – Blackbelt

+0

Ваш код кажется правильным. У вас есть dialog.dismiss(); onPostExecute? –

+0

@blackbelt Моя проблема в том, что диалог отображается только после завершения doInBackground, а не во время его запуска –

ответ

1

На основе комментариев, вы звоните get() на AsyncTask. Это заблокирует подающий поток (основной поток пользовательского интерфейса в вашем случае), пока не будет получен результат асинхронной задачи, то есть doInBackground().

Удалить вызов get() и обработать завершение, например. в onPostExecute() или с помощью функции обратного вызова.

+0

Вы абсолютно правы. Однако теперь я нахожу еще одну проблему, поскольку поток пользовательского интерфейса не ждет результата, как я могу дождаться, пока результат из AsyncThread будет доступен для продолжения моего исполнения? –

+1

Как правило, вам не следует ждать, но пусть приложение выполняет другие задачи, а задача async выполняется в фоновом режиме. Но если вам абсолютно необходимо, вы можете «заблокировать» пользовательский интерфейс диалоговым окном прогресса и возобновить другие задачи в потоке пользовательского интерфейса, например. в асинхронной задаче 'onPostExecute()' или диалоговом окне прогресса 'OnDismissListener'. – laalto

1
private ProgressDialog progressDialog; // class variable  

    private void showProgressDialog(String title, String message) 
    { 
     progressDialog = new ProgressDialog(this); 

     progressDialog.setTitle(""); //title 

     progressDialog.setMessage(""); // message 

     progressDialog.setCancelable(false); 

     progressDialog.show(); 
    }   

onPreExecute()

protected void onPreExecute() 
    { 
     showProgressDialog("Please wait...", "Your message"); 
    } 

Проверить и увольняет onPostExecute() -

protected void onPostExecute() 
    { 
     if(progressDialog != null && progressDialog.isShowing()) 
     { 
      progressDialog.dismiss(); 
     } 
    } 
+4

и в чем отличие от кода OP? – Blackbelt

+0

@Praktik ваш код не работает, он такой же, как у меня –

+0

@ user58760 все еще не отображается диалог прогресса? – TheFlash

Смежные вопросы