2011-12-25 74 views
0

這是一個很奇怪的問題,我不能爲了我的生活找出問題所在。根據斷點的位置,變量的作用是不同的

我有兩個字符串數組,在類的頂部聲明:這是在onCreate方法運行

String[] artistsURLIndexArray; 
String[] artistsOnlyArray; 

他們是在一個單獨的線程(後臺工作)都更新。我在調試中看到一切正常,數組正確更新。

後臺線程我有以下代碼(在onCreate方法仍然)後:

String[] test; 

if(artistsOnlyArray == null) // point A 
{ 
    test = new String[] { "empty...", "asd" }; // point B 
} 
else 
{   
    test = new String[] { "not empty!", "asd" }; // point C 
} 

現在,當我剛剛「跑」的應用程序(沒有調試),test[0]是「空... 」。也就是說,artistsOnlyArray是空的!這不應該是這樣。 (順便說一下,我正在用列表視圖測試test數組。)

如果我繼續前進並在B點放置斷點並調試應用程序,則應用程序在此處停止(休息)。這當然是預料之中的,因爲它聲稱artistsOnlyArray爲空。

如果我在C點放置一個斷點,而不是達到斷點。也'好'。

但是,如果我在A點放置一個斷點,則一切都會改變。當然,斷點已經到了,現在它必須檢查數組是否爲空。我按F8恢復(我正在使用Eclipse),並且突然,test[0]「不是空的!」。我還可以看到artistsOnlyArray正確(不爲空)。

爲什麼斷點的外觀(和位置)引起這種行爲?

+0

這聽起來像你的後臺線程或者在oncreate代碼之前或之後運行,取決於斷點。通常情況下,新的線程不會開始,直到你的線程產量。調試器正在導致你的主線程產生並因此給新線程一個運行的機會。 – BitBank 2011-12-25 22:18:37

回答

1

我只能假設這是因爲「加時」的工作線程都有,當你把A點

斷點當你不放置任何斷點時,if語句的執行發生之前任何工作線程填充數組,因此它輸入if

另一方面,當您在A點放置斷點時,給工作線程指定時間來填充數組。因此,在您繼續使用陣列時,陣列已經填充並進入else

+0

是否有可能檢查後臺線程何時完成,然後執行if語句(和其他)? – eightx2 2011-12-25 22:24:19

+0

如果您使用'Thread'類,則可以使用'join()'。文檔:http://docs.oracle。com/javase/1.5.0/docs/api/java/lang/Thread.html#join%28%29 – 2011-12-25 22:26:30

+0

謝謝,這個工程! – eightx2 2011-12-25 22:46:45

0

你自己回答:「它們都在一個單獨的線程更新」。

斷點可能導致「競爭」狀況,其中線程的相對時間受到干擾。特別是,更新線程可能會或可能不會在發生斷點之前被阻塞。