在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會注意到:「應用程序沒有響應」。但是,我沒有看到任何錯誤。程序運行順利(我也看到文本「結束等待」)。
那麼,誰可以爲我解釋我的代碼。拜託我做了什麼錯事。
謝謝:)
好的答案。如果OP打算做任何會阻塞UI線程超過5秒的任何事情,那麼理想情況下它應該進入AsyncTask。 – Knossos 2012-02-25 17:50:00
@alextsc請給我一個詳細的例子。我創建了一個新的'button',並將其設置爲'onRefresh'事件。之後,當我啓動應用程序時,我按下了「按鈕」,但仍然沒有發生問題。在這裏我爲刷新代碼: – hqt 2012-02-26 03:09:40
公共無效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