2011-05-11 2 views
0

J'essaie de concevoir une classe d'aide qui implémente des méthodes utilisant AsyncTask.Comment retourner une valeur à partir d'une classe auxiliaire avec AsyncTask

public interface ResultCallback 
{ 
    public String processResult(); 
} 

public class ServerAdapter 
{ 

    // Required processResult to call this method. Kind of lousy but I do not know 
    // how to throw exception from onPostExcecute in AsyncTask. 
    public String getResult() throws AirplaneModeException, NoNetworkException 
    { 
     // code to get return value from Dowork throw exceptions on errors 
    } 

    public void getLicense(ResultCallback licenseCallback) 
    { 
     ...// Set url, outmessage 
     new Dowork(url, outMessage, licenseCallback).execute(); 
    } 

    public void queryServer(int queryId, ArrayList<String> args, ResultCallback queryCallback) 
    { 
     ...// Set url, outmessage 
     new Dowork(url, outmessage, queryCallback); 
    } 

    private class Dowork extends AsyncTask<Void, Void, String> 
    { 
     ... 
     private ResultCallback rc; 

     public Dowork(String url, String outMessage, ResultCallback rc) 
     { 
      // code here 
     } 

     protected String doInBackground(Void... params) 
     { 
      try 
      { 
       // code here 
      } 
      catch (AirplaneModeException e) 
      { 
       return "AirplaneModeException"; 
      } 
      catch ... 
     } 

     protected void onPostExecute(String result) 
     { 
      this.result = result; 
      cb.processResult(); 
     } 
    } 
} 

// Client class 
public class myclass extends Activity 
{ 
    MyServerAdapter myAdapter; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     ... 
     myAdapter = new ServerAdapter(); 
     myAdapter.getLicence(new MyLicenseCallback); 
     myAdapter.queryServer(id, args, new MyQueryCallback); 
     ... 
    } 

    public class MyLicenseCallback extends ResultCallback implements processResult 
    { 
     try 
     { 
      String result = myAdapter.getResult; 
      ... 
     } 
     catch 
     ... 
    } 
    ... 

} 

Je suis nouveau à Java et Android et ont quelques questions:

1- Est-ce que plusieurs appels de méthode ServerAdapter provoquer la synchronisation problème? Par exemple, si le code pour le rappel MyLicense est en cours d'exécution, si onPostExecute appelle MyQueryCallback, dois-je le gérer ou Java le gère?

2- Comment faire apparaître l'exception levée dans Dowork dans le rappel au lieu de travailler comme dans le code ci-dessus?

Répondre

1
  1. Android vous garantit que les méthodes dans votre activité et AsyncTask.onPostExecute fonctionne dans le même thread principal de l'interface utilisateur.

  2. Vous pouvez enregistrer l'exception dans la variable d'instance de tâche de la même manière que pour le résultat (renvoyer, disons null comme résultat dans ce cas). Vérifiez si l'exception est présente ou non pour gérer la situation d'erreur.

+0

Je ne veux pas la mise en œuvre de la méthode processResult devoir vérifier les erreurs. En jetant des exceptions si plus tard je décide d'avoir l'interface utilisateur gère une erreur supplémentaire, Je change juste le code de ServerAdapter pour lancer une nouvelle exception Le compilateur se plaint alors de tous les codes qui utilisent le ServerAdapter pour que l'erreur ne puisse pas être ignorée –

+0

@ user747873 vous ne pouvez pas jeter l'exception de 'AsyncTask' si cela signifie .. –

+0

Merci pour votre réponse numéro 1. Pour le numéro 2, je sais que je ne peux pas rejeter une exception d'AsyncTask, c'est pourquoi je dois travailler avec getResult et processResult requis pour appeler getResult. Mais l'exigence est seulement dans la documentation et ne pas avoir le compilateur l'applique. Il serait préférable que le compilateur l'applique ou au moins que C++ rende getResult virtuel pur avec l'implémentation et que la classe dérivée qui implémente getResult appelle l'implémentation de la classe de base (sorte de super() en Java). –

Questions connexes