2014-02-21 57 views
1

在執行以下代碼時,我發現整個應用程序在模擬器屏幕上顯示任何東西之前凍結10000毫秒。我預料會出現第一條Toast消息,然後應用程序凍結10000ms並顯示第二條Toast消息。讓我懷疑android在執行之前是否在'oncreate'方法中堆積了所有的代碼。它應該是這樣嗎?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(); 
     } 
+1

模擬器的整體性能如何? – nikis

+0

使用System.out.println(「您的消息」)進行檢查; ,理想情況下它應該作爲一個正常的功能執行。一個接一個地執行一個LOC。 – Skynet

+0

ServiceCode類中有什麼? –

回答

2

它的行爲如預期。有一個負責UI更新的線程。它被稱爲主線程。此線程也顯示吐司消息。當您撥打Toast.show()時,Android會爲主線程安排一項新任務。當主線程完成與onCreate(),它將執行此任務並顯示敬酒。但是因爲你阻止主線程 10秒,所以沒有顯示敬酒。沒有人可以免費,誰可以顯示此消息。但接着,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); 

    } 
} 
+0

但第一道敬酒後主線程被阻塞,所以應該先顯示敬酒。 – Diffy

+0

@Diffy不,請閱讀我的回答:「Android安排新任務」而不是「顯示敬酒」 –

0

原因很簡單,麪包類的表演方法可能不是同步調用「內部」,我的意思是,主線程是不太可能要等到實際顯示的麪包和呈現繼續,因此,它可能會啓動一個功能,開始呈現Toast BUT,因爲緊接着強制主線程停止,它不處理該請求,因爲主線程具有最高優先級。

希望它有幫助!

問候!

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(); 
     } 
     } 
1

當創建一個活動,系統進程將消息發送到活動的UI線程。 Activity的UI線程收到消息,然後執行「onCreate」方法。

在這裏,您可以在「onCreate」方法中烤麪包。這不會立即顯示敬酒。它只向UI線程的消息隊列發送消息。在UI線程完成「onCreate」onStart「onResume」方法後,它會收到「Toast」消息。在那一刻,吐司實際上顯示在屏幕上。

0

Toast的顯示是一個異步調用。因此,一旦執行了Toast請求,操作系統就跳轉到下一個操作,同時準備並顯示Toast。 在你的情況下,因爲下一個操作會阻塞UI線程10秒,直到UI線程被釋放纔會顯示Toast。