2013-07-06 77 views
0

我在說一個線程。例如,我在它的活動UI和下面的方法:可以通過主事件循環中斷代碼執行嗎?

/* TOP LEVEL OF EXECUTION LOOPER NOW WORKING */ 

class MyActivity extends Activity { 
void onCreate(Bundle instance) { 
super.onCreate(instance); 
setContentView(R.layout.activity_main); 
doComplicatedStuff(); 
} 

void doComplicatedStuff() { 
// Doing stuf 
} 

void onClick() { 
// Process event 
} 

void anyOtherMethod() { 
    /* NOT TOP LEVEL OF EXEUCTION, LOOPER NOW CAN'T WORK */ 
} 
} 

/* TOP LEVEL OF EXECUTION, LOOPER NOW WORKING */ 

所以我的問題是,可以doComplicatedStuff()被打斷的onClick()處理(當然這時,我們有一個點擊的按鈕)的執行?

現在我認爲比onClick()處理程序不能中斷doComplicatedStuff()執行,直到doComplicatedStuff()結束其工作。因爲在代碼執行的頂層,我們有一個Looper,它接受下一個消息事件並將其分派給Handler(處理程序,然後調用onClick()方法)。換句話說,只有在這個線程中沒有任何執行方法的時候,Looper纔會執行你的工作。

回答

1

你是對的。 GUI線程將在onCreate函數中忙碌,因此即使將項目提交給活套,也無法調用onClick方法來中斷複雜的套接字。

事實上,這種事情只有在涉及多個線程時纔有可能。即便如此,如果它需要提交runOnUiThread,它可能會因長時間運行的操作正在進行而失敗。

我建議你在第二個線程上執行你的complicatedStuff例程。長時間運行的操作不屬於UI線程。

+0

非常感謝! 昨天我問了一個問題。這個問題是關於runOnUiThread,所以我想這個答案在它的問題(http://stackoverflow.com/questions/17489551/multiple-asynctasks-onpostexecute-order)是不正確的? –

+0

他的回答是正確的,我的回答也是正確的。這兩個地址分開的問題。我的假設只有一個線程正在運行。他不這樣做,所以任務可以異步執行。但是,一次只有一個任務會更新GUI。當一個項目在GUI上工作時,如果你願意,這個項目可能會中斷一些其他的異步工作。但是,其他任務可能處於任何狀態。甚至可能已經完成。我不會建議這種方法。 –