2014-07-23 2 views
-1

UI를로드하고 싶으면 사용자가 UI를 볼 수있는 다른 코드를 볼 수 있습니다. UI 스레드에서 해당 코드를 실행하고 싶습니다. 내가이 일을 얻을 수UI가 표시된 후 안드로이드 실행 메소드/코드가 표시됩니다.

onCreate(){ 
     setContentView(R.layout.mylayout);//myLayout starts with a blue background 
     myLayout = (LinearLayout).... 
     myLayout.setBackgroundColor(red); 
    } 

    onViewDisplayed(){ 
    //myLayout is visible and shows a red background while the UI thread is blocked by Thread.sleep() 
     Thread.sleep(5000); 
     myLayout.setBackgroundColor(yellow); 
    } 

한 가지 방법은이 일을하는 것입니다 :

onCreate(){ 
     setContentView(R.layout.mylayout);//myLayout starts with a blue background 
     myLayout = (LinearLayout).... 
     myLayout.setBackgroundColor(red); 
     handler.postDelayed(runnable,1000);//runnable calls onViewDisplayed() above 
    } 

이 방법은 내가 원하는 것이 아니다,하지만. postDelayed를 100ms로 변경하면 myLayoutThread.sleep(5000) 앞에 빨간색 배경이 표시되지 않으므로 노란색 배경이 보입니다.

가능한 경우 지연을 지정하지 않고 레이아웃을 표시 한 후 보장 된 실행으로 어떻게이 작업을 수행 할 수 있습니까?

답변

1

청취자는 ViewTreeObserver입니다. 내가 제안하는 것은 OnPreDrawListener입니다.

myLayout.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    @Override 
    public boolean onPreDraw() { 
     // Remove the listener so that it is only invoked once 
     myLayout.getViewTreeObserver().removeOnPreDrawListener(this); 

     // Post a Runnable to be executed on the *next* animation frame 
     ViewCompat.postOnAnimation(myLayout, myRunnable); 

     // Return true if this first frame should be drawn 
     return true; 
    } 
}); 
+0

작동하는 것처럼 보입니다. 나는 내일 그것을 시험 할 것이다. – Jakar

0

당신은 postDelayed를 시작할 수있는 onResume에서이를 수행 할 수 있습니다. 한 번만 수행하려는 경우 savedInstanceState에 저장할 수 있습니다.

+0

'onResume'의'postDelayed'는 같은 효과가 있습니다. 지연을 너무 작게 만들면 완료 될 때까지 아무 것도 화면에 표시되지 않습니다. – Jakar

+0

발생한 동작을 설명 할 수 있습니까? 5 초 동안 2 개의 배경을 볼 수 없습니까? 지연된 게시물에서 이것을 제거하십시오. Thread.sleep (5000); 그리고 처리기의 시간으로 5000 초를 넣으십시오. – AlexBalo

+0

UI를 업데이트 할 때 타이머를 사용하여 백그라운드 asynctask를 설정할 수 없습니까? – johng

관련 문제