Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用回调但代码在错误的对象上运行_Java_Android_Asynchronous_Concurrency_Fragment - Fatal编程技术网

Java 使用回调但代码在错误的对象上运行

Java 使用回调但代码在错误的对象上运行,java,android,asynchronous,concurrency,fragment,Java,Android,Asynchronous,Concurrency,Fragment,我已经实现了一个用于运行异步(使用并发)HTTP调用(使用net)的回调,当它们完成时,它们调用在调用方中实现的完整回调,这是一个用于更新gui的片段。在调用完整例程的代码中,我将其包装在处理程序和循环器(使用主循环器)中,这样完整的代码就可以在主线程上运行,否则我会遇到线程异常b/c,它无法更新GUI。除了以下几点,其他一切似乎都很好 我有一个活动,在主区域使用导航抽屉和碎片,它们在中被替换。所有其他片段都可以正常工作,在其中一个片段中,我有一个视图寻呼机,其中包含更多可以浏览的片段。现在在寻

我已经实现了一个用于运行异步(使用并发)HTTP调用(使用net)的回调,当它们完成时,它们调用在调用方中实现的完整回调,这是一个用于更新gui的片段。在调用完整例程的代码中,我将其包装在处理程序和循环器(使用主循环器)中,这样完整的代码就可以在主线程上运行,否则我会遇到线程异常b/c,它无法更新GUI。除了以下几点,其他一切似乎都很好

我有一个活动,在主区域使用导航抽屉和碎片,它们在中被替换。所有其他片段都可以正常工作,在其中一个片段中,我有一个视图寻呼机,其中包含更多可以浏览的片段。现在在寻呼机中使用了一个类,并以两种不同的方式为在init上加载的第一页/第二页构造,我传递不同的init信息,但它进行相同的异步调用并传递“this”,因此调用知道使用回调来处理gui上的响应。但是这是两个独立的对象和页面,因此回调应该在正确的对象和页面上进行。viewpager提前构建了当前页面和下一页面的两个对象,但奇怪的是,回调只在第二个页面上调用(对于这两个页面),并正确地滑动到它加载的第二个页面/inits,但第一个页面没有,因为没有对其触发回调

当我将调试代码放入回调时,第二个对象将被调用,而不是第一个对象。因此,这两个异步调用都在第二个对象(第二个视图寻呼机页面)上运行,该对象尚未显示,但可以滑动到。这完全没有意义,当设置回调时,我使用“This”,因此它应该始终是对象的正确实例,我不知道第二个页面/对象如何获得所有回调……对象被创建,触发异步调用,为回调传递“This”,并实现回调接口

请不要对使用android async提出任何建议,我们有很多原因必须这样做,android文档甚至出于各种原因推荐并发

我认为这与我正在使用的处理程序/循环器代码有关,可能因为片段/视图页面以及我如何在主线程代码上运行而发生了一些奇怪的事情……否则我无法解释,因此希望您提供任何信息。我花了很长时间调试,无法理解可能出现的问题


谢谢。

删除了viewpager,而是通过代码重新创建了viewpager手动提供的外观。通过使用片段(与代码的其余部分一样)并用每个新片段替换主容器,问题得到了解决。所以也许碎片中的碎片是不好的


我刚刚手动重新创建了浏览页面提供的滑动/外观和感觉。

第一个建议:发布代码。我们需要一些代码来了解您在说什么。但是如果我不得不猜测的话,我认为您有一个对象,您将回调传递给了该对象,并且所有实例共享一个回调(您随后重写了该回调),或者您重用了同一个对象(导致您覆盖回调)。但如果没有代码,这纯粹是猜测。通过浏览视图并使用它,片段似乎可以正确初始化并工作,但不是在第一次加载时。只有在浏览视图并使其重建/构造之后…所以我不明白。回调模式和异步代码之间有很多代码,视图寻呼机和自定义适配器…在这里发布的内容太多了。然后发布一个。我认为问题是run on ui线程可能在另一个对象上运行它,因为许多片段实现了回调接口,因此,如果对象死亡或超出范围,并被一个新对象替换,则在ui上运行的线程可能只是劫持该对象并运行其回调。因为偶尔我会有一种奇怪的行为,运行另一个片段回调,而这与视图寻呼机无关。