【问题标题】:why is onResume code called before layout display?为什么在布局显示之前调用 onResume 代码?
【发布时间】:2018-01-09 01:41:08
【问题描述】:

我有两个活动,AB; A 的布局包含一个按钮ABut 来调用B。我想在B 的布局完全呈现(用户可见的组件)之后执行代码。从Android life Cycle Doc 我应该将该代码放入onResume 方法中。这就是我所做的,但代码仍然在布局渲染之前执行。为了在B的布局显示之前检查该代码是否有效执行,我确实在该代码中延迟了4秒,结果是:点击ABut在4秒内没有任何反应,然后@987654330 @的布局显示:确认onResume里面的代码在布局显示之前被有效调用!!!。

这里我给你部分代码:

A的代码:

...
public void onAButClick(View v){
    startActivity(new Intent(getApplicationContext(),BActivity_.class));
}
...

B的代码:

...
 @Override
protected void onResume() {

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

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

}
...

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    在 Resume 中尝试放置处理程序而不是 thread.sleep

    super.onResume();
     handler.postDelayed(new Runnable() {
                @Override
                public void run() {
    
                    Log.i(TAG,"data loaded");
                }
            }, 4000);
    

    别忘了在你的活动 (B) 中声明hander,我希望这项工作

    【讨论】:

      【解决方案2】:

      在 4 秒内什么都没有发生,然后显示 B 的布局

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

      我想在 B 的布局完全呈现后执行代码 (用户可见的组件)

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

      希望对您有所帮助!

      【讨论】:

      • 我知道屏幕冻结是因为 Thread.sleep,这是故意的。只是为了测试 onResume 下的代码在屏幕显示之前执行。
      • 没关系,但你能告诉我投反对票的原因吗?我的解决方案取决于您的陈述
      • 我不是对你投反对票的人......无论如何,我没有测试你的解决方案,因为它没有回答我的问题。我想了解奇怪的行为。
      猜你喜欢
      • 2016-05-14
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2016-03-08
      • 2011-07-12
      相关资源
      最近更新 更多