Andriod耗时操作的处理(音乐播放器欢迎界面)

      在做Android开发的时候,有时候需要在一个Activity的里面调用两次 setContentView方法。比如在应用启动的时候,开始显示欢迎界面,在显示欢迎界面的同时,进行后台数据的处理,等到后台数据准备好了,才显示 真正的应用界面。这样的做法不会让使用者有突兀的感觉。反之,应用已启动就显示真正的应用界面,但在后续的操作需要准备数据的时候,假定是5秒钟,那么在 这5秒钟内使用者将无法使用该应用,这样用户界面显然是不够友好的。

 

为了实现欢迎界面,大家很自然地就会想到:在onCreate方法中,调用两次 setContentView。是的,要调用两次setContentView,但怎么调用还是有点技巧,而不是简单地调用两次 setContentView就可以解决问题的。下面,我们就用实际的例子来给予说明。

import android.app.Activity;

import android.os.Bundle;

 

public class WelcomeActivity extends Activity

{

       @Override

       public void onCreate(Bundle savedInstanceState)

       {

            super.onCreate(savedInstanceState);

            //setContentView(R.layout.main);    // 把这一句改为下面一句,用以显示欢迎界面

            setContentView(R.layout.welcome);

       

            // 下面是模拟数据处理需要5秒钟的时间

            try

            {

                    Thread.sleep(5000);

            }

            catch (InterruptedException e)

            {

                    e.printStackTrace();

            }

            setContentView(R.layout.main);                  // 显示真正的应用界面

       }

}

你将会发现,欢迎界面根本没有出现。在本该出现欢迎界面的时候,界面上什么也没有,过了五秒钟程序会直接显示主页面,
将
setContentView(R.layout.welcome);和下面的setContentView(R.layout.main); 交换位置后程序运行时开始的五秒钟界面什么也不现实,五秒钟后会出现欢迎界面.
因为setContentView方法所指定的View,只有在onCreate方法返回后才会显示在界面上。因此,如果调用了两次setContentView方法,只有最后一次才是有效的。



 

















import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

 

public class WelcomeActivity extends Activity

{

         private Handler handler;                  // 声明handler

       @Override

       public void onCreate(Bundle savedInstanceState)

       {

                    super.onCreate(savedInstanceState);

                    //setContentView(R.layout.main);                                // 把这一句改为下面一句

                    setContentView(R.layout.welcome);

            

                    // 初始化handler

                    handler = new Handler()

                    {

                             @Override

                             public void handleMessage(Message msg)

                             {

                                      if(msg.what == 1)                                         // handler接收到相关的消息后

                                      {

                                                setContentView(R.layout.main);    // 显示真正的应用界面

                                      }

                             }

                    };

           

                    // 新建一个线程,过5秒钟后向handler发送一个消息

                    Runnable runnable = newRunnable()

                    {

                             public void run()

                             {

                                      try

                                      {

                                                Thread.sleep(5000);//用静止五秒张模拟耗时操作

                                      }  

                                      catch (InterruptedException e)

                                      {

                                                e.printStackTrace();

                                      }

                                      handler.sendEmptyMessage(1);

                             }

                    };

                    Thread thread = new Thread(runnable);

                    thread.start();

        

//                  // 下面是模拟数据处理需要5秒钟的时间

//                  try

//                  {

//                          Thread.sleep(5000);

//                  } 

//                 catch (InterruptedException e)

//                  {

//                          e.printStackTrace();

//                  }

//        

//                 setContentView(R.layout.main);                

    }

}

 出自:http://blog.csdn.net/pathuang68/article/details/6713498

猜你喜欢

转载自dxz.iteye.com/blog/1970843