2014-09-13 5 views
2

2 액티비티로 간단한 애플리케이션을 설정했습니다. 나는 첫 번째 활동에 문제가 있었다. 로고를 3 초 동안 표시 한 다음 두 번째 활동을 시작하는 데 사용됩니다. 문제는 레이아웃을로드하지 않으며, 3 초를 기다린 다음 두 번째 활동을로드한다는 것입니다. 코드는 여기에 있습니다 :활동이 레이아웃을로드하지 않습니다.

다른 스레드를 생성하고 거기서 기다리는 것을 실행함으로써이 문제를 해결할 수있었습니다. 고정 코드는 다음과 같습니다.

new Thread(){ 
      public void run(){ 
       try { 
        Thread.sleep(3000); 


       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       startActivity(myAct); 
       finish(); 
      } 

      }.start(); 

그래서 실제로 문제가 수정되었습니다. 나는 그것이 왜 두 번째 방법으로 작동 하는지를 알고 싶다. 그러나 나는 그것을 이해하지 못하기 때문에 처음에는 제대로 작동하지 않는다.

답변

4

첫 번째 경우에는 UI Thread이 잠자기 상태가되어 레이아웃을 그릴 수 없다는 뜻입니다. 수면 프로세스가 끝나면 즉시 다음 Activity을 시작합니다. 그래서 첫 번째 Activity 레이아웃이 보이지 않습니다. 이 방법은 잠자기 시간에 사용하지 않는 것이 좋습니다. 응용 프로그램이 사용자 동작에 응답하지 않습니다. AsyncTask이나 Thread 또는 Handler을 사용하고 postDelayed() 메서드를 사용하는 것이 좋지만 UIThread이 UI 작업 그리기 및 처리를 중지하지 않도록하는 것이 좋습니다.

두 번째 경우 UIThread이 아닌 을 새 Thread으로 만듭니다. 따라서, UI Thread은 중단되지 않고 전체 레이아웃을 그릴 수 있습니다. 동시에 수면 시간도 존중됩니다. sleep()이 종료되면 새 Activity이 시작됩니다.

1

첫 번째 방법은 UI 스레드를 잠자기 상태로 만듭니다. 이로 인해 활동의 모든 작동 및 UI 상호 작용이 중지됩니다. 두 번째 방법은 다른 스레드를 사용합니다. 주 UI 스레드의 모든 UI 부분을 잠자기 상태로 만드는 다른 스레드이므로 의도 한대로 코드가 작동합니다.

1

실제로 접근법 또한 잘못되었거나 나쁜 습관입니다. 새로운 활동 시작 및 현재 완료는 주 스레드에서 수행해야합니다. 또한 최종 개체 초기화를 피하기 위해 메모리에 스택 될 수 있습니다. 여기 은 (MainThread에서 수행됩니다 postDelayed()) 올바른 접근 방식 중 하나입니다

공용 클래스 startActivity를 활동 {

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.start_screen); 

View view = findViewById(R.id.any_view_from_start_screen_layout); 
view.postDelayed(new Runnable(){ 
    public void run(){ 
    startNewActivityAndCloseCurrent(); 
},3000); 


} 
private void startNewActivityAndCloseCurrent(){ 
Intent myAct = new Intent(this, MyActivity.class); 
    startActivity(myAct); 
    finish(); 
} 
} 
를 확장
관련 문제