2010-07-02 23 views
3

J'ai une activité parente et une activité enfant qui étend l'activité parente. Lorsque le parent démarre l'activité enfant,Activité parent et enfant Android onCréer une question

Quelle onCreate est exécutée en premier? L'enfant ou le parent?

Une variable particulière est définie dans la méthode onCreate de l'activité enfant. En ce moment, il semble qu'il faut un certain temps avant d'accéder à onCreate de l'activité enfant. Les méthodes du parent signalent donc une variable vide . Alors que quand je fais dormir le parent pendant un moment, il rapporte la variable correcte.

Merci Chris

Activité parent:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.mylayout); 

    goButton = (ImageButton) this.findViewById(R.id.goButton); 
    goButton.setOnClickListener(new OnClickListener() { 
     public void onClick(View view) { 

      Intent childIntent = new Intent("com.example.Child"); 

      String newValue = "Child Value"; 
      Bundle bun = new Bundle(); 
      bun.putString("value", newValue); // add two parameters: a string and a boolean 
      childIntent.putExtras(bun); 
      startActivity(childIntent); 
     } 
    }); 

    this.doTheWork("Parent Value"); 
} 

private void doTheWork(String value) { 
    new MyNewThread(value).start(); 
} 


public String getTheValue(String value) { 
    return "My Value is: " + value; 
} 

private class MyNewThread extends Thread { 
    String value; 
    public LoadThread(String v) { 
     this.value = v; 
    } 
    @Override 
    public void run() { 
     String str = getTheValue(this.value); 
    } 
} 

Activité enfant:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Bundle bun = getIntent().getExtras(); 
    childValue = bun.getString("value"); 
} 

public String getTheValue(String value) { 

    return "My Value is: " + value; 
} 

Donc, en gros, même après que le parent commence l'enfant, il retourne toujours "Valeur parent" , mais quand j'ai le fil de sommeil, il retourne "Valeur enfant".

+0

Il serait préférable que vous postez le code. – primpap

+1

Ce serait encore mieux si vous avez posté * tout * du code. Il semble que vous confondiez l'héritage Java ("extends") avec 'startActivity()', et il est donc très difficile de comprendre exactement ce que vous avez écrit ici. – CommonsWare

+0

Mon mauvais, j'étais en train de me confondre avec les extensions et startActivity. J'appelais super en premier, et c'est pourquoi onCreate de mon Parent était exécuté d'abord. Merci CommonsWare !!! – Chris

Répondre

0

Première réponse à propos de la séquence. Le premier est appel parent et le prochain est enfant. Cette information, vous pouvez lire à partir de votre code source.

L'information suivante explique pourquoi vous avez des résultats différents lorsque vous utilisez le mode veille. Tout d'abord, le code de Child Activiry onCreate n'est pas terminé, car il ne montre pas comment vous utilisez field (ou la variable locale) childValue. Mais je m'attends à ce que vous créiez un nouveau thread dans l'objet enfant. N'oubliez pas que les threads ne sont pas exécutés au moment où vous créez le thread, mais au moment où le runtime trouve le temps pour cela. La méthode sleep informe runtime que vous pouvez exécuter le thread car votre thread principal dort et c'est la raison du résultat différent. Il est important de créer deux threads un dans l'enfant et un dans le parent.

2

Votre méthode de classe étendue (la classe enfant) est appelé en premier, mais la méthode de votre super-classe est appelée immédiatement après depuis la première ligne dans la méthode de votre classe enfant est

Activité enfant

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

Cette est un appel explicite à la méthode onCreate de votre super classe.