执行线程和弱引用之间的黑暗关系?

时间:2013-06-01 15:59:16

标签: android multithreading null weak-references

我面临一个奇怪的问题我甚至不知道如何正确解释,但我希望有人面对这个伪问题,并且可以告诉我它为什么会发生。

我有一个复杂的活动,偶尔会跨越线程来加载资源。

看起来,不知何故,如果我在UI线程上的一个线程的执行上下文中分配弱引用,它将返回null。

我绝对相信我不会将该引用置空,因为我只将它分配到一个地方,就像:

function assignReference(FunqSlide slide) {

    mWeakEditSlide=new WeakReference<FunqSlide>(newSlide);
    if (Conf.LOG_ON) Log.d(TAG, "SetSlide_internal "+index+"="+mWeakEditSlide+"->"+mWeakEditSlide.get());
    .
    .
}

这会生成具有分配给有效对象的预期弱引用的跟踪

    06-01 17:40:50.030: D/FunqStory[Hiphop en LA](18390): SetSlide_internal 4=java.lang.ref.WeakReference@41625d18->FunqSlide{40f60728}
    .
    . next is processing 

但程序流程仍在继续,稍后,函数会访问先前创建的引用,但它是空的!

    06-01 17:40:53.330: D/FunqStory[Hiphop en LA](18390): *** CURRENT EDIT SLIDE ID weakreference is null!!!

    06-01 17:40:53.330: E/AndroidRuntime(18390): FATAL EXCEPTION: main
    06-01 17:40:53.330: E/AndroidRuntime(18390): java.lang.NullPointerException
    06-01 17:40:53.330: E/AndroidRuntime(18390):    at com.regaliz.funq.gui.Props_LayerList.loadSlide(Props_LayerList.java:77)
    06-01 17:40:53.330: E/AndroidRuntime(18390):    at com.regaliz.gui.fragments.FunqHelperSupport$Frag.setup_native_pane(FunqHelperSupport.java:1028)
    06-01 17:40:53.330: E/AndroidRuntime(18390):    at com.regaliz.libneo.NativeStory$ActionBarHandler.handleItemSelected(NativeStory.java:1612)

并且,如果已经取消它,那么在nullpointerexception之前应该有一个函数assignRefennce的调试跟踪,但是没有,这表明我的代码之外的东西是为我取消引用。

当然我已经解决了它只是在同一个线程中做的事情,但我真的想知道发生了什么!

任何指针?还是WeakReferences?的xD

提前致谢!

1 个答案:

答案 0 :(得分:0)

您是否尝试从与创建它的线程不同的线程中读取WeakReference?如果您那时需要使用正确的同步,以便可以看到更改。