我有一个扩展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?
答案 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),我建议您将IntentService
与ResultReceiver
结合使用,而不是AsyncTask
,因为它更强大模型(例如,方向改变没有问题)。
您可以在我开源的应用代码中看到一个示例:http://bit.ly/ZR2n8R