android oncreate如何工作?

时间:2014-02-21 06:17:56

标签: android android-asynctask

在执行以下代码时,我发现整个应用程序冻结了10000毫秒,然后在模拟器的屏幕上显示任何内容。我原本期望第一个Toast消息出现,然后应用程序冻结10000毫秒,第二个Toast消息出现。让我想知道android在执行它之前是否堆积了'oncreate'方法中的所有代码。应该是那样的吗?

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this, new ServiceCode("Hi").s, Toast.LENGTH_SHORT).show();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Toast.makeText(this, new ServiceCode("Hello").s, Toast.LENGTH_SHORT).show();
        }

6 个答案:

答案 0 :(得分:2)

表现如预期。有一个负责UI更新的线程。它被称为主线程。该线程也显示了Toast消息。当您致电Toast.show()时,Android会为主线程安排新任务。当主线程onCreate()完成时,它将执行此任务并显示吐司。但是因为你阻止了主线程 10秒,所以没有显示toast。没有人免费,谁可以显示此消息。但是,10秒后,两个祝酒词将一个接一个地出现,因为主线程可以自由显示它们。

最佳做法是永不阻止 主线程。否则您的应用程序将冻结,用户将看到ANR(应用程序或响应)消息。如果您需要稍后执行某些操作,则需要将此任务发布到主线程的任务队列,以便稍后执行。

以下代码的行为符合您的预期。

public class MainActivity extends Activity {

    private Handler handler = new Handler();

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

        // show first toast immediately
        Toast.makeText(this, new ServiceCode("Hi").s, Toast.LENGTH_SHORT).show();

        // schedule second toast to appear 10 sec later
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, 
                    new ServiceCode("Hello").s, Toast.LENGTH_SHORT).show();
            }
        }, 10000);

    }
}

答案 1 :(得分:1)

创建活动时,系统进程会向活动的UI线程发送消息。活动的UI线程收到消息,然后执行“onCreate”方法。

在这里,您可以在“onCreate”方法中祝酒。这不会立即显示吐司。它只将消息发送到UI线程的消息队列。在UI线程完成“onCreate”“onStart”“onResume”方法后,它会收到“Toast”消息。那一刻,Toast实际上显示在屏幕上。

答案 2 :(得分:0)

原因很简单,Toast类的show方法可能不是“内部”的同步调用,我的意思是,主线程不太可能等到Toast实际显示并呈现为继续,因此,它可能会启动一个功能来开始渲染Toast BUT,因为在强制主线程停止之后,它不会处理该请求,因为主线程具有最高优先级。

希望它有所帮助!

问候!

答案 3 :(得分:0)

查看这些链接以了解Android生命周期

http://developer.android.com/training/basics/activity-lifecycle/index.html

Android activity life cycle - what are all these methods for?

你创建了一个启动画面,

如果不删除

try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } 

你应用程序不会冻结。

答案 4 :(得分:0)

试试这个:

Toast.makeText(this, new ServiceCode("Hi").s, Toast.LENGTH_SHORT).show();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
        Toast.makeText(this, new ServiceCode("Hello").s, Toast.LENGTH_SHORT).show();
        }
      }

答案 5 :(得分:0)

Toast的显示是异步调用。因此,一旦执行了Toast请求,操作系统就跳转到下一个操作,同时准备并显示toast。 在您的情况下,由于下一个操作阻止UI线程持续10秒,因此在释放UI线程之前不会显示Toast。