从Application显示对话框

时间:2013-04-29 08:03:02

标签: android

我有一个扩展Application的类,在onCreate方法中我从数据库中加载了一些内容并且它没有意义,所以异步执行,因为没有该数据,应用程序是无用的。 1.问题:当加载需要几秒钟时,Android会显示ANR。 2.问题:我可以从扩展的应用程序类中显示一个对话框吗?

pd = new ProgressDialog(this);

pd = new ProgressDialog(getApplicationContext());

结果

E/AndroidRuntime(14168): java.lang.RuntimeException: Unable to create application com.example.skelett.GlobalApp: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

我是否应该在第一个onCreate的{​​{1}}方法中执行所有加载工作? 当我想要阻止用户界面直到我的东西被加载时,如何防止ANR?

5 个答案:

答案 0 :(得分:1)

你永远不应该允许你的申请冻结。决不。在AsyncTask中加载内容并向用户显示一些进度,为用户添加取消加载的选项。如果没有数据则无用,请告知用户他应该等待此过程完成并在用户确认时再次启动,否则只需退出应用程序。

答案 1 :(得分:0)

您需要重新考虑您的设计。我建议您将长时间运行的任务移动到它自己的线程(AsyncTask或线程),并使用启动/加载活动启动您的应用程序,该活动等待您的长期运行任务完成,然后再转换到您的主要活动。关于长时间运行后台任务的另一个很好的参考:http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

答案 2 :(得分:0)

您应该始终在不同的线程上执行此类操作。您可以在加载数据时显示进度条以显示正在发生的事情。这样你就不会让用户猜测究竟发生了什么。您可以在progressBar中显示一条有意义的消息,说“数据正在加载”,这将足够好。

避免在UI线程上执行长时间操作。请改用Asynctask。或者,如果要加载的数据位于应用程序的第一个屏幕上,您可以在应用程序启动时显示SplashScreen,并在SplashScreen显示期间在后台获取数据,以便在第一个屏幕显示时可以显示app出现了。

阅读Keeping your app responsive了解详情。

答案 3 :(得分:0)

正如前面的答案所涵盖的那样,在AsyncTask尝试显示ProgressDialog Application无法创建Activity上下文时,您最好以Broadcast加载数据UI元素,您需要使用Activity上下文执行此操作。

一种简单的方法是在数据加载完成后设置一个标志,当第一个屏幕启动时,如果尚未设置标志,则可以显示对话框。您还可以在加载数据时发送{{1}},以便{{1}}知道隐藏对话框。

答案 4 :(得分:0)

你正在接近这个问题: 你应该做的是开始在你显示的第一个活动中加载数据,并在该活动中显示一个进度条/对话框,告知用户她/他必须等待。

如果加载需要一些时间(假设可能需要> 1s),我建议您将IntentServiceResultReceiver结合使用,而不是AsyncTask,因为它更强大模型(例如,方向改变没有问题)。

您可以在我开源的应用代码中看到一个示例:http://bit.ly/ZR2n8R