2012-12-24 48 views
2

我遇到问题,我做了一个简单的应用程序来向您显示我的问题。 我希望setContentView在执行睡眠之前执行并显示.xml。我认为一切都会按顺序执行? 有没有人可以说我为什么不这样做?setContentView执行太迟

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,似乎是一个更大的问题。

所有与睡眠工作正常,但与连接方法有问题。

公共无效的onCreate(捆绑savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

ConnectBluetooth(); 

} 

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

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

非常感谢!

+1

IMO'睡眠(...)'在任何编程语言中的黑客在任何平台上,但如果你在Android中使用它(特别是在主/ UI线程中),你确实会遇到麻烦。 – Squonk

回答

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

“你永远不应该像这样暂停UI线程。”单独为这句话赞成,但也有相同的基本答案。 – Sam

+0

非常感谢!我的问题是,我不知道,那个创建者必须完成对这个xml的内容的显示! 我只用这个睡眠小程序向你展示了我的意思,我的程序有一个蓝牙连接来打电话,这需要一些时间,但我不想发布这个长时间的程序。 – user1927295

+0

@ 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); 
+0

100?那应该不是10000? ;) – Squonk

+1

是的。一时之间,我对OP正在尝试做什么感到困惑。 – Sam