2011-08-18 74 views
1

我严格分隔了Android应用程序的不同部分之间的层次。 在执行的某个时候,我正在从Internet上的xml服务更新我的数据。该更新大约需要10秒钟,并且完全在后台完成 - 这意味着应用程序的用户界面可以正常工作。然而,进一步调用我的类(后来 - DataManager),它负责数据更新(更新已经开始但尚未完成)使我的应用程序崩溃。抛出NullPointerException异常的对象。Android并发问题

所以我假设一次只有一个线程可以使用我的DataManager,而从其他线程调用DataManager最终会出现异常。

我尝试了将'synchronized'关键字放在敏感方法附近的各种组合,但似乎更新正在执行 - 没有任何东西可以使用我的DataManager中的任何东西。

在执行过程中与DataManager相关的其他类似乎也包含空对象。

我想我只是缺少某种设计模式,用于处理并发问题,也许任何人都可以建议我一些东西?

+1

你能否提供一些你认为是NullPointerException的根本原因的代码。很难想到任何并发问题。 –

+0

看看它是否只是一个NullPointerException,然后我可以自己处理它,我对调试Android应用程序非常有经验。但是这个问题似乎影响整个应用程序。可悲的是我无法提供代码,因为它有太多的影响,代码库相当大......这不像我忘记初始化一些愚蠢的变量......当我没有更新时,一切正常。更新实际上只涉及我的经理类中的四个ArrayLists。其实等一下,我可以发布我的更新方法并解释一下。 – Kostas

+0

所以这是实现所有更新的实际方法:http://pastebin.com/gY3x8wiq 它直接(和间接)只能访问四个ArrayLists。即使在执行过程中,其他对象也会受到影响。 – Kostas

回答

2

由于线程问题,我无法处理使用Apache HTTP客户端,我认为你的问题在这方面可能类似。我最终做的是建立一个回调方案。当然,这可能或可能不适合你。

这可能看起来有点像Rube Goldberg,但是它对我很有用。

我会让我的UI线程调用我的数据管理器对象的方法,产生一个线程去获取数据。该方法的返回值是EVENTUALLY中包含数据的对象。我会让我的活动扩展一个接口,就像“DataCallbackInterface”一样,该方法在线程获取数据(即run()中的最后一行)后调用。由于该调用本质上将在另一个线程内,所以您需要使用Handler在您的DataCallbackInterface方法的实现中运行任何有用的东西。当调用该方法时,您将知道数据存在,而不依赖于任何奇怪的同步标记来正确使用。

+0

这实际上是一个绝妙的主意。使用事件将我的DataManager锁定在正在执行更新的同一线程中,并禁止其他程序部分正确使用DataManager!对? :D 所以我应该做这样的后台任务,它执行所有的操作,并且只返回数据的最后一行代码。因此,在执行过程中,我的程序将使用DataManager中的旧数据,并且在更新执行完成后,数据将被替换。不用担心线程!对?我的意思是,我有正确的想法吗? – Kostas

+0

我想我是。虽然它需要重新设计一些我的应用程序部件,但这绝对会起作用!谢谢 :) – Kostas