2011-05-16 71 views
0

是否可以从Runnable执行AsyncTask?根据我的经验可以完成,但不安全。当我的应用第一次运行时,我的AsyncTask可以从Runnable中正常运行。但是,当应用程序移动到后台,然后带回前面我得到“不能创建处理程序内部没有调用Looper.prepare()”的线程。从runnable调用asynctask

下面是我想要做的: 我正在使用MapView并在onCreate中调用runOnFirstFix(Runnable)。我的Runnable调用一个AsyncTask来执行一个Web服务调用,它根据位置返回一些数据。 我将应用程序移动到背景(通过点击主页按钮),一段时间后,我再次将应用程序向前移动,并在我调用AsyncTask的execute()时得到异常。

首先,为什么runOnFirstFix被再次执行?其次,它为什么第二次引发异常? 我猜测有一些我不明白的生命周期部分。

谢谢。

+2

为什么你将'AsyncTask'调用封装到'Runnable'中?它的'doInBackground'方法在后台线程中运行,在'onPre-'和'onPostExecute'中,您可以操作您在UI线程中声明的gui和其他东西。另一方面,当你将应用程序放到前台时,你的'onCreate'方法被调用,这就是为什么'runOnFirstFix'再次运行。 – rekaszeru 2011-05-16 05:53:05

+0

我想重用现有的AsyncTask,但我想我可以将该逻辑直接移入Runnable。至于runOnFirstFix的第二次调用,我不相信它是(直接)因为你陈述的原因,而是因为我正在onCreate()实例化一个MyLocationOverlay的新实例, – cagreen 2011-05-16 13:33:19

回答

0

我最初并不清楚AsyncTask需要从UI线程调用。所以当runOnFirstFix第二次运行时,它是来自一个不在UI线程中的Runnable。为了解决这个问题,我简单地创建了另一个Runnable来运行AsynchTask。

我的runOnFirstFix似乎被调用两次的原因仅仅是因为我正在创建它的一个新实例。