【问题标题】:setContentView execute too latesetContentView 执行太晚
【发布时间】:2012-12-11 02:56:00
【问题描述】:

我有一个问题,我制作了一个简单的应用程序来向您展示我的问题。 我希望 setContentView 在执行 Sleep 之前执行并显示 .xml。我以为一切都会按顺序执行? 有没有人能告诉我为什么它不这样做?

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // do something
    }

非常感谢!

编辑:

这里是真正的OnCreate,好像问题比较大。

使用 sleep 一切正常,但使用 Connect 方法时出现问题。

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

ConnectBluetooth();

}   

在 ConnectBluetooth() 方法中,我只是创建一个新的 Socket 并尝试连接。

使用 ned 线程或处理程序似乎不起作用,那我该怎么办?使用类似 asynctask 的东西?

非常感谢大家!

【问题讨论】:

  • IMO sleep(...) 是任何平台上任何编程语言的 hack,但如果你在 Android 中使用它(尤其是在主/UI 线程上),你真的是在自找麻烦。

标签: android


【解决方案1】:

当您调用sleep 时,您正在暂停 UI 线程。这将阻止onCreate 返回,这将阻止框架完成您的活动的初始化,包括显示您的视图层次结构。

你不应该像那样暂停 UI 线程。如果你想在 10 秒后做某事,你可以启动一个单独的线程,它会在正确的时间做:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new Thread() {
        @Override
        public void run() {
            try {
                Thread.sleep(10000);
                doSomething();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }.start();
}

更简洁的方法是使用Handler:

Handler mHandler;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mHandler = new Handler();
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            doSomething();
        }
    }, 10000);
}

【讨论】:

  • "你不应该这样暂停 UI 线程。"只为这句话点赞,但也为有相同的基本答案点赞。
  • 非常感谢!我的问题是,我不知道,oncreate 必须完成才能显示 xml 的内容!我只是做了这个带睡眠的小程序来告诉你我的意思,我的程序有一个蓝牙连接可以调用,这需要一些时间,但我不想发布这个长程序。
  • @user1927295 - 进行蓝牙通话、进行网络活动——甚至访问设备上的文件系统——都应该在 UI 线程之外完成。在最近的 Android 版本中,仅尝试在 UI 线程上执行网络活动就会引发异常。
【解决方案2】:

直到创建过程完成后,在调用onResume() 之后,才会显示布局。但是布局显示时没有回调,但是你可以使用 Handler 和 Runnable 来做到这一点。


创建几个字段变量:

Handler handler = new Handler();
Runnable delay = new Runnable() {
    @Override
    public void run() {
        // Do something 
    }
};

onCreate() 通话:

handler.postDelayed(delay, 10000);

【讨论】:

  • 100?不应该是10000吗? ;)
  • 是的。一时间,我对 OP 想要做什么感到困惑。
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
相关资源
最近更新 更多