Android线程混乱

时间:2011-10-21 18:59:40

标签: java android

我已经编写了一个函数来创建一个启动画面,我的应用程序超时5秒。

代码工作正常,但是当超时达到零并且我想重定向到我的主要活动时,应用程序崩溃并出现以下错误:

Only the original thread that created a view hierarchy can touch its views.

所以我环顾了一下,有人建议在我的功能中嵌套这个。这似乎是一个好主意,但现在像睡眠/停止这样的方法将无效。

我的代码如下,如果不够清楚,我可以提供更多/详细解释,请告诉我。谢谢你的帮助。

        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        showSplashScreen();

    }

    protected boolean _active = true;
    protected int _splashTime = 5000;  // Splash screen is 5 seconds

    public void showSplashScreen() {

        setContentView(R.layout.splash_layout);

//      Thread splashThread = new Thread() {

         runOnUiThread(new Runnable() {

             @Override
             public void run() {
                 try {
                     int waited = 0;
                     while (_active && (waited < _splashTime)) {
                         Thread.sleep(100);
                         if (_active) {
                             waited += 100;
                         }
                     }
                 } catch (InterruptedException e) {
                     // do nothing
                 } finally {
                     showApplication();
                 }
             }
         });
    }

5 个答案:

答案 0 :(得分:7)

可能不是您想听到的内容,但您不应该在您的移动应用上放置启动画面。除了游戏,当人们使用他们想要进入的移动应用程序时,做他们需要做的事情,然后离开。如果你让这个过程需要更长的时间,人们就会对你的应用程序感到沮丧。您可能应该重新考虑不使用启动画面。

答案 1 :(得分:2)

我相信你想要 AsyncTask 。调用完成任务的方法将在UI线程上调用,这使得修改UI元素变得更加容易。

答案 2 :(得分:2)

这将在UI线程上执行sleep。这绝不是一个好主意。

为什么不是这样的?

new Handler().postDelayed(new Runnable() {
    public void run() {
        // start application ...
    }
}, _splashTime);

但是this answer有一个好点。显示启动画面5秒可能非常烦人。

答案 3 :(得分:0)

使用处理程序将事件发布到将删除启动的UI线程。

代码应该像......

   splash.show()
   new Handler().postDelayed(
      new Runnable() {
          void run() {
              splash.remove();
          },
      delayTime);

答案 4 :(得分:0)

我建议您为spalsh屏幕制作新活动,以常规方式显示(使用startActivityForResult)并在其中放置此类代码(在其中,而不是在您的主要活动中):

new Handler().postDelayed( new Runnable()
  {
  public void run()
    { finish(); }
  }, 5000 );

此外,您还可以处理此新活动点击事件,让用户有机会更快地关闭它,点击它。