2012-03-15 32 views
0

我有一个应用程序使用ListActivity为用户提供一系列操作。当他们点击一个我使用Intent发起一个单独的活动。使用带有ListActivity的AsyncTask显示加载屏幕

我的问题是,应用程序执行的操作需要大约20秒才能完成,并且由于我不希望用户收到那个令人讨厌的ANR对话框,我试图使用AsyncTask向他们展示加载屏幕与此同时。我尝试使用setContentView(R.layout.loading);,onPreExecute(),但它引发了一个NullPointerException,据我所知,这是由于loading.xml不是“ListView的ID为android.R.id.list”的事实。

那么我现在可以做什么?我怎样才能显示加载屏幕?有没有办法解决这个令人烦恼的问题?任何帮助将不胜感激。谢谢!

回答

1

我不确定你的用例是什么;你有一个立即填充的项目列表,并且在选择一个项目后采取行动?采取的行动是启动另一个执行后台处理的活动?

还是需要很长时间才能填充操作列表?

如果是前者,可以使用AsyncTask作为长时间运行的活动,而不是使用Intent来启动另一个活动:在回调中获得点击相关项目的回调时,您将创建AsyncTask,并在doInBackground,您将执行长时间运行的活动,onPostExecute根据需要刷新或操作您的列表。

要考虑的另一件事是使用对话框显示加载屏幕,如果在启动新的活动之前需要加载加载。

如果您可以进一步描述您的用例,我可以帮助您更多。

+0

非常感谢您的详细解释。该列表在我启动应用程序后立即加载。一旦用户从列表中选择一个选项,就会发生长时间的过程。我将很快研究对话框的方法。在尝试这个之前,我想知道一件事情...在长时间后台处理完成后不会onPostExecute运行吗? – Drider 2012-03-16 00:02:55

+0

漫长的过程是否需要您向用户显示任何内容?完成后,他们会回到列表中,还是去其他地方? – 2012-03-16 13:55:22

+0

我的情况稍微有所改变......我现在可以很容易地显示加载屏幕,但是我有点盲目,现在意识到大部分的加工都是在我的新活动中完成的。所以我为长操作实现了AsyncTask,但我的活动仍然拒绝显示任何类型的接口,直到完成完成,即使'setContentView'是与'super.onCreate()'一起使用的第一行。我也尝试在onPreExecute()上使用setContentView,但它没有区别,我不明白为什么。 – Drider 2012-03-16 17:39:16

0

这不是AsyncTask需要的加载屏幕,它是20秒的Activity初始化。我会寻找一种方法来在服务的后台线程中完成所有设置,而用户可以自由地在其他活动中进行游戏。我会尽力找到一种不会让用户停顿20秒的方法。也许带他们到目标活动,并显示他们从他们上次访问缓存的数据,直到新的准备就绪。

+0

感谢您的回答。这确实有道理。这会涉及'doInBackground()'和'onPreExecute()'使用意图吗? – Drider 2012-03-15 22:34:51

0

启动并显示您正在调用的Activity的onCreate()中的加载对话框,然后在AsyncTask的onPostExecute()中调用Dialog.dismiss()。