2011-06-21 2 views
1

Je suis d'activité, dans onCreate() je tente de récupérer les données:Catch exception

protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     ............... 
     fillUI(); 
    } 

public void getDetailedItem(){ 
     FeedParser parser=new FeedParser(); 
     try{ 
      mItem=parser.parseDetailed(); 
     }catch(Exception e){ 
      closeAndShowError(); 
     } 
    } 

    public void fillUI(){ 
     getDetailedItem(); 
     if(mItem!=null){ 
     ............... 
     }else{ 
      closeAndShowError(); 
     } 
    } 

private void closeAndShowError(){ 
     Context context = getApplicationContext(); 
     CharSequence text = getResources().getString(R.string.toast_error); 
     int duration = Toast.LENGTH_SHORT; 

     Toast toast = Toast.makeText(context, text, duration); 
     toast.show(); 

     finish(); 
    } 

Them problème est, quand l'exception occures, il est pris, et j'attends mon activité se terminer, mais je reste obtenir le code à l'intérieur de fillUI() exécuté, donc j'ai dû mettre if instruction après getDetailedItem(); Comment le résoudre?

+0

Pouvez-vous attraper l'exception, il int méthode 'fillUI()'? – spot35

Répondre

1

Vous pouvez faire quelque chose comme ceci:

public void getDetailedItem(){ 
     FeedParser parser=new FeedParser(); 
     try{ 
      mItem=parser.parseDetailed(); 
     }catch(Exception e){ 
      mItem = null; 
     } 
} 

Puis, en fillUI() si mItem est null vous montrer de l'erreur;

0

L'instruction finish() n'est pas un retour immédiat, votre code continue de s'exécuter jusqu'à ce qu'il décide qu'il est terminé. Vous devez vous laisser un indicateur de l'exception, et revenir à travers votre chaîne d'appel quand cela arrive, au lieu de continuer à courir.

0

Depuis que vous attrapez l'exception; la fonction fillUI() n'est jamais avertie de toute erreur.

Votre codepath est le suivant: fillUI -> getDetailedItem -> exception pris -> closeAndShowError -> finish() -> retour à closeAndShowError -> retour à getDetailedItem bloc après prise -> retour de nouveau à fillUI. Donc, fondamentalement, le code après getDetailedItem dans fillUI est appelé parce que vous avez intercepté l'exception et n'avez pas laissé l'autre fonction le savoir. Soit par valeur de retour, soit en lançant (et peut-être en attrapant) une nouvelle exception.

0

finish() provoque l'arrêt du Activity comme étape suivante de son cycle de vie. Mais au moment où vous l'appelez, il est encore dans le processus d'une autre étape du cycle de vie: onCreate(). Il ne sortira pas, d'une manière ou d'une autre, immédiatement au milieu d'une méthode.

C'est la réponse, mais, mieux serait de refaire votre code un peu. Ce n'est probablement pas la façon la plus propre de gérer cela si vous avez affaire à des questions comme celle-ci.

1

Vous pouvez passer l'exception qui pourrait se jeter dans parseDetailed la méthode fillUI:

public void getDetailedItem() throws Exception { 
    FeedParser parser=new FeedParser(); 
    mItem=parser.parseDetailed(); 
} 

public void fillUI(){ 
    try { 
     getDetailedItem(); 
     // rest of your code.. 
    } catch(Exception e) { 
     closeAndShowError(); 
    } 
}