2011-12-25 76 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

你自己回答:“它们都在一个单独的线程更新”。

断点可能导致“竞争”状况,其中线程的相对时间受到干扰。特别是,更新线程可能会或可能不会在发生断点之前被阻塞。