2011-03-01 3 views
1

J'ai un AsyncTask qui récupère les données du serveur. Ce dont j'ai besoin est de montrer les données récupérées dans un dialogue. Comment puis-je appeler la fonction pour créer la boîte de dialogue depuis l'AsyncTask? Si je ne peux pas faire cela, alors quelles options ai-je? Est-il possible de savoir si un AsyncTask a été terminé ou non?Est-il possible d'appeler une autre fumction depuis l'intérieur d'AsyncTask?

Voici mon code:

//Function calling the AsyncTask 
public void getData(int pos) 
{ 
new DBTask().execute(); 
//Is it possible to know here if the AsyncTask has ended or not?? 
} 

private class DBTask extends AsyncTask<Long, Boolean, Integer>{ 
    ProgressDialog ServerPD = new ProgressDialog(MRRankingActivity.this); 

    @Override 
    protected void onPreExecute() 
    { 
     ServerPD = ProgressDialog.show (MRRankingActivity.this, "", "Connecting to server...", true, false); 
    }//End of onPreExecute 

    @Override 
    protected Integer doInBackground(Long... params) 
    { 
     publishProgress(isOnline()); 

      if(isOnline()) 
      { 
      getDBData(); 
        if(isOK) 
         { 
        //I want to show the result by calling this function.. 
         showResult(); 
//Calling this function will trow error..So how can i show my result?? 
         Log.d("LIST","DONE..Reached Final Destination"); 

         } 
      } 
     } 

     return null; 
    } 

     @Override 
    protected void onProgressUpdate(Boolean... isConnection) { 
    // TODO Auto-generated method stub 

    super.onProgressUpdate(isConnection); 
    if(isOnline()) 
      { 
      ServerPD.setMessage("Retreving Data"); 
      } 
    } 

     @Override 
    protected void onPostExecute(Integer result) { 
     if (ServerPD.isShowing()) 
     { 
      ServerPD.dismiss(); 
     } 


    }//End of onPostExecute 
}//End of DBTask 

public void getDBData() 
{ 

    try{ 
    //Code foe connecting to database and retreive data. 
    //If everything is ok then isOK is set to True.. 
    //else its set to false  

     isOK=true; 
      } 
    catch(Exception e) 
     { 
      isOK=false; 
     }//End if catch 
} 

public void showResult() 
{ 
    //I want to show result here in a new Dialog ... 
} 

//Checking is connection available 
public boolean isOnline() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
     return true; 
    } 
    return false; 
} 

Comment puis-je montrer le résultat dans cette situation? Existe-t-il une méthode pour déterminer si AsyncTask est terminé?

Répondre

1

ce que Mathew suggested..just Simplifier modifier votre code comme celui-ci d'abord modifier doInBackgroud en initialisant un int varable isSuccess et puis en changeant la valeur de isSucces à 1 dans l'instruction isOK if. Maintenant, retour isSuccess.comme celui-ci

@Override 
    protected Integer doInBackground(Long... params) 
    { 
     int isSuccess=0; 
     publishProgress(isOnline()); 

      if(isOnline()) 
      { 

      getDBData(); 
        if(isOK) 
         { 
         isSuccess=1; 
         } 
      } 
     } 

     return isSuccess; 
    } 

Modifions maintenant votre PostExecute() pour traiter la valeur isSuccess ruturned comme résultat dans onPostExecute

@Override 
    protected void onPostExecute(Integer result) { 
     if (ServerPD.isShowing()) 
     { 
      ServerPD.dismiss(); 
     } 
     if(result==1) 
      { 
       showResult(); 
      } 

    }//End of onPostExecute 

Hope this helps.

+0

merci ... vous l'avez fait si simple – Shijilal

1

Au lieu de donner

private class DBTask extends AsyncTask<Long, Boolean, Integer>{ 

donner

private class DBTask extends AsyncTask<Long, Boolean, Boolean>{ 

ensuite à l'intérieur doInBackground() créer une variable:

boolean success = false;

intérieur ur IfOnline() Marque:

success = true; 

Et à la fin de cette méthode donne:

return success; 

l'intérieur de votre onPostExecute() prendre paramètre comme booléen au lieu de Integer.

Donner:

if(result) { 

showResult(); 

} 

Hope this peut vous aider. OnPostExecute() est seulement appelé après le doInBackground().

+0

merci ... il était utile – Shijilal

0

Shijilal ... Lorsque la méthode doInBackground se termine, vous êtes notifié dans onPostExecute. La valeur de retour dans doInBackground est envoyée à onPostExecute. Vous ne devez pas toucher l'interface utilisateur dans doInBackground qui s'exécute dans un thread séparé du thread d'interface utilisateur.

Je pense à appeler isOnline avant d'appeler asynchTask.execute. Je pense que la méthode dans doInBackground renverrait le type Result qui serait ensuite envoyé à onPostExecute. Donc, considérons: AsynchTask<SQLQuery,Void,ResultSet> ou tout ce qui est approprié.

1

La meilleure façon d'atteindre votre intention est de créer un Handler et d'afficher la boîte de dialogue dans cela. quelque chose comme ça

class RefreshHandler extends Handler { 

    @Override 

    public void handleMessage(Message msg) { 

AlertDialog.Builder alertbox = new AlertDialog.Builder(
          CardDetails.this); 
        alertbox.setMessage("Please Login First ..."); 
        alertbox.setPositiveButton("Ok", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface arg0, 
             int arg1) { 
           } 
          }); 
        alertbox.show(); 

    } 
} 

et le faire à partir de votre tâche async

new RefreshHandler().sendEmptyMessage(0)

Questions connexes