Android 执行线程和weakreference之间的黑暗关系?

Android 执行线程和weakreference之间的黑暗关系?,android,multithreading,null,weak-references,Android,Multithreading,Null,Weak References,我面临着一个奇怪的问题,我甚至不知道如何正确地解释,但我希望有人遇到过这个伪问题,能告诉我它发生的原因 我有一个复杂的活动,偶尔会跨越线程来加载资源 看起来,不知怎么的,如果我在一个线程的执行上下文中分配一个weakreference,稍后在UI线程上,它会返回null 我绝对肯定我不会将该引用置空,因为我只在一个地方分配它,就像: function assignReference(FunqSlide slide) { mWeakEditSlide=new WeakReference&

我面临着一个奇怪的问题,我甚至不知道如何正确地解释,但我希望有人遇到过这个伪问题,能告诉我它发生的原因

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

看起来,不知怎么的,如果我在一个线程的执行上下文中分配一个weakreference,稍后在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: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


提前谢谢

您是否试图从创建它的线程以外的线程读取
WeakReference
?如果您需要使用适当的同步,以使更改可见。

出于好奇,为什么要使用WeakReference?它们指向在不同情况下重新创建的片段,如旋转屏幕、取消活动焦点、生成子活动等。。。我想在这种情况下显式地销毁它们,解除它们的位图绑定,等等。。。因为它们是很重的物体,里面有很多位图。使用weakreference确实有很大帮助,因此可以快速地对所有内容进行GC,并为子活动留下大量内存。最重要的是,这些片段都在一个ViewPager中…到底什么是null,mWeakEditSlide本身还是mWeakEditSlide.get()的结果?mWeakEditSlide!!!!这不是很奇怪吗?是的,先生!当我从另一个线程执行时,它会崩溃。。。在你看来,我应该在对象上还是在weakreference上同步?顺便说一句——在我分配它之后,它崩溃了大约3秒钟。是否有可能在没有同步的情况下它还不可见?@rupps尝试将mWeakEditSlide声明为volatile@Michael只是尝试了易变和瞬态,没有工作,但是非常感谢你给我指明了方向,我忘记了那些东西的存在,可能与它们有关,但是代码非常复杂,使用不同的处理程序/线程/等。。。我很高兴地接触到一切,没有挥发物/瞬变/同步。。。我想我需要一个重构;)听起来您可以使用重构过程。注意,瞬变不会有任何帮助;该关键字与序列化有关,而不是与同步有关。同步什么并不重要,只要每次读写该引用时都是一样的。还要注意的是,同步关键字不是您在这里的唯一选择。如果您使用AsyncTask或ExecutorService之类的工具,它们将为您提供可见性保证。@Michael&zienikk哇!我终于发现了这个问题,它相当隐蔽。问题是,我的类将内部类导出为WebView的JavaScriptInterface。当类被重新初始化时(在我回答的过程中),WebView在页面重新加载之前不会更新JSIF,所以WeakRef等。。。是堆中一个旧的、保留的对象的那些,它指向谁知道在哪里。。。后来,我从JS触发了对内部类的调用,该类属于旧实例。天哪!我必须深入DDMS才能找到这一切。谢谢大家!
    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)