2010-07-02 5 views
3

부모 활동과 부모 활동을 확장하는 하위 활동이 있습니다. 부모가 자식 작업을 시작하면Android 부모 및 자녀 활동 관련 질문하기

먼저 실행되는 onCreate는 무엇입니까? 아이 또는 부모는?

하위 활동의 ​​onCreate 메소드에서 설정하는 특정 변수가 있으며, 지금은 하위 활동의 ​​onCreate에 도달하는 데 시간이 걸리는 것으로 보이므로 부모 변수의 메소드가 빈 변수를보고하고 있습니다 . 반면에 잠시 부모님을 잠자 게하면 올바른 변수가보고됩니다.

감사 크리스

학부모 활동 :

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); 
    } 
} 

아동 활동 :

@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; 
} 

그래서, 기본적으로 부모가 자식을 시작 후에도 여전히 반환 "부모 값" ,하지만 스레드가 잠을 때 "자식 값"반환합니다.

+0

코드를 게시하는 것이 좋습니다. – primpap

+1

코드의 * all *을 게시하는 것이 더 좋을 것입니다. Java 상속 ("extends")을 startActivity()로 혼동하는 것처럼 느껴 지므로 여기에 정확히 무엇을 적어 뒀는지 이해하는 것은 매우 어렵습니다. – CommonsWare

+0

실망 스럽지만 실제로는 extends 및 startActivity와 혼동 스러웠습니다. 나는 슈퍼를 먼저 호출하고 있었고, 이것이 바로 부모님의 onCreate가 먼저 처형당하는 이유입니다. CommonsWare 감사합니다! – Chris

답변

0

시퀀스에 대한 첫 번째 대답입니다. 첫 번째는 부모 호출이고 다음은 자식입니다. 이 정보는 소스 코드에서 읽을 수 있습니다.

다음 정보는 수면을 사용할 때 다른 결과가 나타나는 이유에 대한 것입니다. 먼저 Child Activiry onCreate의 코드는 필드 (또는 로컬 변수) childValue를 사용하는 방법을 보여주지 않기 때문에 완료되지 않았습니다. 하지만 당신이 너무 자식 개체에 새 스레드를 만드는 것으로 기대합니다. 쓰래드를 생성 할 때 순간적으로 실행되는 것이 아니라 런타임이이를 찾은 순간에 쓰레드가 실행된다는 것을 기억하십시오. 메소드 sleep은 메인 스레드가 잠자고 있기 때문에 스레드를 실행할 수 있다는 것을 런타임에 알려주며 이것이 다른 결과의 원인입니다. 중요한 것은 자식 스레드와 부모 스레드를 만드는 것입니다.

2

확장 된 클래스의 메소드 (하위 클래스)를 먼저라고하지만 슈퍼 클래스의 방법은 바로 후 아이 클래스의 방법의 첫 번째 행이

자식 활동

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

} 

이 때문에라고 수퍼 클래스의 onCreate 메소드에 대한 명시적인 호출입니다.