2012-02-25 49 views
0

在Android開發者網站上曾經說過:我們不應該在UIThread中使用長時間的操作工作。相反,我們應該在另一個線程上完成。在這個網站上,他們還是說:Android應用程序:將在UIThread塊更多5秒後收到「應用程序未響應」?

如果UI線程被阻塞了超過幾秒鐘(約5 秒當前)用戶呈現臭名昭著 「應用無響應」(ANR)對話框。

爲了測試這個陳述,我做了一個證明。這是我的代碼:

package com.app; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class Example extends Activity{ 
    TextView textView; 
    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     textView = new TextView(this); 
     textView.setText("please wait"); 
     setContentView(textView); 

    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     try { 
      Thread.sleep(8000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     textView.setText("end waiting !!!"); 
    } 

} 

正如你所看到的,我使當前線程(UIThread)睡眠8秒。所以,我認爲,如果我運行這個應用程序,Android會注意到:「應用程序沒有響應」。但是,我沒有看到任何錯誤。程序運行順利(我也看到文本「結束等待」)。

那麼,誰可以爲我解釋我的代碼。拜託我做了什麼錯事。

謝謝:)

回答

1

@hqt在你的子問題(抱歉,我不能發表評論),如果你希望你的程序終止,你點擊你的button後,當你在button 8秒 - 運行,你應該再次點擊你的按鈕,「魔法」會發生,如你所願:)

8

這裏的問題是,你不產生任何信號/事件被阻止。當您或系統在5秒內未響應某個事件時,Android會顯示該對話框。沒有事件意味着沒有對話。

所以你的代碼運行良好,直到你嘗試做某件事。如果我沒有做任何事情就運行你的代碼,它的工作沒有問題。如果我在開始時按菜單鍵生​​成事件,它將觸發ANR,因爲鍵事件無法正確處理。

希望這有助於:)

+0

好的答案。如果OP打算做任何會阻塞UI線程超過5秒的任何事情,那麼理想情況下它應該進入AsyncTask。 – Knossos 2012-02-25 17:50:00

+2

@alextsc請給我一個詳細的例子。我創建了一個新的'button',並將其設置爲'onRefresh'事件。之後,當我啓動應用程序時,我按下了「按鈕」,但仍然沒有發生問題。在這裏我爲刷新代碼: – hqt 2012-02-26 03:09:40

+2

公共無效onRefresh(查看視圖){ \t \t嘗試{ \t \t \t了Thread.sleep(8000); \t \t}趕上(InterruptedException的E){} \t \t \t \t textView.setText( 「結束等待!!!」); \t \t \t} – hqt 2012-02-26 03:10:11