0

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

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

看起来,不知何故,如果我在一个线程的执行上下文中分配一个弱引用,稍后,在 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 的调试跟踪,但没有,这表明我的代码之外的某些东西正在为我清空引用。

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

任何指针?还是弱引用?xD

提前致谢 !

4

1 回答 1

0

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

于 2013-06-01T16:27:19.893 回答