为什么在布局显示之前调用onResume代码?

时间:2018-01-07 23:45:00

标签: android android-layout android-activity android-lifecycle

我有两项活动BABut;广告的布局包含一个B按钮,可以调用B。我想在onResume的布局完全呈现(用户可见的组件)之后执行代码。从Android life Cycle Doc我应该将该代码放入B方法中。这就是我所做的,但代码仍然在渲染布局之前执行。要在ABut的布局显示之前检查该代码是否有效执行,我确实在该代码中放了4秒的延迟,结果是:在B点击后,没有在4秒内发生,然后显示... public void onAButClick(View v){ startActivity(new Intent(getApplicationContext(),BActivity_.class)); } ... 的布局:这确认了在布局显示之前有效调用onResume内的代码!!!。

这里我给你部分代码:

A代码:

...
 @Override
protected void onResume() {

    super.onResume();
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    Log.i(TAG,"Data Loaded");       

}
...

B&#39的代码:

{{1}}

有人可以告诉我为什么onResume方法中的代码在布局显示之前执行,如何在视图完全呈现后才能执行它?

由于

2 个答案:

答案 0 :(得分:0)

在on Resume上尝试放置handler而不是thread.sleep

super.onResume();
 handler.postDelayed(new Runnable() {
            @Override
            public void run() {

                Log.i(TAG,"data loaded");
            }
        }, 4000);

别忘了在你的活动(B)中宣布叛徒,我唠叨这项工作

答案 1 :(得分:-1)

  

4秒内没有任何事情发生,然后显示B&#39>

这是因为你在主线程中调用Thread.sleep(4000);所以它被冻结了4000秒。

  

我希望在B&#39的布局完全呈现后执行代码   (用户可见的组件)

  1. 声明View rootView;与您的根布局关联。
  2. onCreate

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        rootView = findViewById(R.id.root);
        ViewTreeObserver vto = rootView.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
             @Override
             public void onGlobalLayout() {
                 rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                 // now your layout is completely rendered
                // execute your code here
             }
       });
    }
    
  3. 希望有所帮助!