Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use AsyncTask to show a ProgressDialog while doing background work in Android? [duplicate]

Tags:

Possible Duplicate:
Updating progress dialog in Activity from AsyncTask

I am developing my first Android App and I need a ProgressDialog to be showed while a background task, in this case just a http call on the server, happens. I did a bit of studying on this and also have already checked other threads related to this subject.

http://developer.android.com/reference/android/os/AsyncTask.html

Android show ProgressDialog until activity UI finished loading

Android SplashScreen

http://android-developers.blogspot.com/2009/05/painless-threading.html

Among others.

Than I got to write a bit of code:

1) In My Activity I declare a variable to be of type ProgressDialog

public class LoginActivity extends Activity {      public static final String TAG = "LoginActivity";      protected ProgressDialog progressDialog;  ... 

2) I have also written an inner class to extend AsyncTask as required, here in the doInBackGround is where I call a static method which actually do the POST http request to the server, in the server side I have blocked the server response 20s to validate the progress dialog.

class EfetuaLogin extends AsyncTask<Object, Void, String> {          private final static String TAG = "LoginActivity.EfetuaLogin";          @Override         protected void onPreExecute()         {             Log.d(TAG, "Executando onPreExecute de EfetuaLogin");         }           @SuppressWarnings("unchecked")         @Override         protected String doInBackground(Object... parametros) {             Log.d(TAG, "Executando doInBackground de EfetuaLogin");             Object[] params = parametros;             HttpClient httpClient = (HttpClient) params[0];             List<NameValuePair> listaParametros = (List<NameValuePair>) params[1];             String result = null;             try{             result = HttpProxy.httpPost(AnototudoMetadata.URL_AUTENTICACAO, httpClient, listaParametros);             }catch (IOException e) {                 Log.e(TAG, "IOException, Sem conectividade com o servidor do Anototudo! " + e.getMessage());                 e.printStackTrace();                 return result;             }             return result;         }          @Override         protected void onPostExecute(String result)         {             progressDialog.dismiss();         }      }  

3) When the button is pressed I than build the ProgressDialog anc call the AsyncTask I have created:

    OnClickListener loginListener = new OnClickListener() {       public void onClick(View v) {   //next line should start progress dialog in main thread ?????    progressDialog = ProgressDialog.show(LoginActivity.this, "Login in", "Wait a moment please", true, false);     //next couple of lines should do an ascyn call to server    EfetuaLogin efetuaLogin = new EfetuaLogin();    efetuaLogin.execute(params);    try {     //recover the server response and sets time out to be 25seconds     sResposta = efetuaLogin.get(25, TimeUnit.SECONDS); 

Well, this is it, I believe this was suppose to show a progress dialog while the AsyncTask would query the server in background, but what I get is NO progress bar until server response arrives and than for a fraction of time(less than 1 second) the progress shows and the next Activity is called.

As I mentioned I have re-checked this code and simply can't find where I got it wrong. Any suggestions?

Thank you in advance.

Hi, as suggested by Charlie Sheen(???) in the first answer for this thread I have tryied changing a bit of my code and now it is like(Unfortunatelly it is not working as expected so far):

OnClickListener loginListener = new OnClickListener() {         public void onClick(View v) {                 //async call????????         new EfetuaLogin().execute(params); ... 

And than do all the work to deal with response in the AsyncTask:

class EfetuaLogin extends AsyncTask<Object, Void, String> {          private final static String TAG = "LoginActivity.EfetuaLogin";          @Override         protected void onPreExecute()         {             super.onPreExecute();             Log.d(TAG, "Executando onPreExecute de EfetuaLogin");             //inicia diálogo de progresso, mostranto processamento com servidor.             progressDialog = ProgressDialog.show(LoginActivity.this, "Autenticando", "Contactando o servidor, por favor, aguarde alguns instantes.", true, false);         }           @SuppressWarnings("unchecked")         @Override         protected String doInBackground(Object... parametros) {             Log.d(TAG, "Executando doInBackground de EfetuaLogin");             Object[] params = parametros;             HttpClient httpClient = (HttpClient) params[0];             List<NameValuePair> listaParametros = (List<NameValuePair>) params[1];             String result = null;             try{             result = HttpProxy.httpPost(AnototudoMetadata.URL_AUTENTICACAO, httpClient, listaParametros);             }catch (IOException e) {                 Log.e(TAG, "IOException, Sem conectividade com o servidor do Anototudo! " + e.getMessage());                 e.printStackTrace();                 return result;             }             return result;         }          @Override         protected void onPostExecute(String result)         {             super.onPostExecute(result);              if (result == null || result.equals("")) {                 progressDialog.dismiss();                 Alerta                         .popupAlertaComBotaoOK(                                 "Dados incorretos",                                 "Os dados informados não foram encontrados no Sistema! Informe novamente ou cadastre-se antes pela internet.",                                 LoginActivity.this);                 return;             }              Log.d(TAG, "Login passou persistindo info de login local no device");             ContentValues contentValues = new ContentValues();             contentValues.put(AnototudoMetadata.LOGIN_EMAIL, sLogin);             contentValues.put(AnototudoMetadata.LOGIN_SENHA, sSenha);             contentValues.put(AnototudoMetadata.LOGIN_SENHA_GERADA, result);             LoginDB loginDB = new LoginDB();             loginDB.addLogin(LoginActivity.this, contentValues);             Log.d(TAG, "Persistiu info de login no device, redirecionando para menu principal do Anototudo");             Log.d(TAG, "O retorno da chamada foi ==>> " + result);             // tudo ok chama menu principal             Log.d(TAG, "Device foi corretametne autenticado, chamando tela do menu principal do Anototudo.");              String actionName = "br.com.anototudo.intent.action.MainMenuView";             Intent intent = new Intent(actionName);             LoginActivity.this.startActivity(intent);             progressDialog.dismiss();         }      }  

Complete OnClickListener:

OnClickListener loginListener = new OnClickListener() {     public void onClick(View v) {         Log.d(TAG, "Usuario logado, chamando menu principal");         TextView tLogin = (TextView) findViewById(R.id.loginText);         TextView tSenha = (TextView) findViewById(R.id.senhaText);         String sLogin = tLogin.getText().toString();         String sSenha = tSenha.getText().toString();          if (sLogin.equals("") | sSenha.equals("")) {             Alerta.popupAlertaComBotaoOK("Campos Obrigatórios",                     "Os campos Login e Senha são obrigatórios para autenticação do Anototudo.", LoginActivity.this);             return;         } else {             Pattern regEx = Pattern.compile(".+@.+\\.[a-z]+");             Matcher matcher = regEx.matcher(sLogin);             if (!matcher.matches()) {                 Alerta.popupAlertaComBotaoOK("Formato e-mail inválido", "O formato do campo e-mail está inválido",                         LoginActivity.this);                 return;             }         }           List<NameValuePair> listaParametros = new ArrayList<NameValuePair>();         listaParametros.add(new BasicNameValuePair("login", sLogin));         listaParametros.add(new BasicNameValuePair("senha", sSenha));          Log.d(TAG, "valores recuperados dos campos de login e senha: " + sLogin + " | " + sSenha);          // Reutiliza cliente HttpClient disponibilizado pela Aplicação.         AnototudoApp atapp = (AnototudoApp) LoginActivity.this.getApplication();         HttpClient httpClient = atapp.getHttpClient();          //prepara lista de parametros para fazer chamada asíncrona no servidor para autenticar.         Object[] params = new Object[2];         params[0] = httpClient;         params[1] = listaParametros;          //faz chamada assincrona         new EfetuaLogin().execute(params);     } }; 
like image 274
groo Avatar asked Oct 08 '10 19:10

groo


People also ask

Is it possible to start AsyncTask from background thread?

Methods of AsyncTaskwe can directly comminicate background operation using on doInBackground() but for the best practice, we should call all asyncTask methods . doInBackground(Params) − In this method we have to do background operation on background thread.

Which method is used to start the background thread of AsyncTask?

To start an AsyncTask the following snippet must be present in the MainActivity class : MyTask myTask = new MyTask(); myTask. execute(); In the above snippet we've used a sample classname that extends AsyncTask and execute method is used to start the background thread.

How many times an instance of AsyncTask can be executed?

AsyncTask instances can only be used one time.

What is the problem with AsyncTask in Android?

In summary, the three most common issues with AsyncTask are: Memory leaks. Cancellation of background work. Computational cost.


1 Answers

Place your ProgressDialog in onPreExecute, sample code below:

private ProgressDialog pdia;  @Override protected void onPreExecute(){     super.onPreExecute();         pdia = new ProgressDialog(yourContext);         pdia.setMessage("Loading...");         pdia.show();     }  @Override protected void onPostExecute(String result){    super.onPostExecute(result);         pdia.dismiss(); } 

and in your onClickListener, just put this line inside:

new EfetuaLogin().execute(null, null , null); 
like image 133
Wroclai Avatar answered Nov 07 '22 06:11

Wroclai