2013-04-29 100 views
1

我有一个扩展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 

两个resultet我应该大概做所有的东西装在我的第一个ActivityonCreate方法? 我怎样才能防止ANR当我想要阻止用户界面,直到我的东西被加载?

+0

你写的AsyncTask该代码? – 2013-04-29 08:12:12

+2

不要使用'getApplicationContext()'创建对话框。对话框需要一个活动上下文才能附加到屏幕上。另一方面,加载数据而不显示ANR只是使用AsyncTask或其他一些在后台线程上工作的类。 – hardartcore 2013-04-29 08:44:07

回答

0

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

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

阅读Keeping your app responsive了解更多详情。

1

你不应该让你的应用程序冻结。决不。执行AsyncTask中的加载内容并向用户显示一些进度,添加用于取消加载的选项。如果没有数据就没用,告诉用户他应该等待这个过程完成,并在用户确认后再次启动,否则退出应用程序。

0

由于以前的答案已覆盖你会更好装载您在AsyncTask试图显示ProgressDialog当你崩溃的原因是Application上下文无法创建UI元素的数据,你需要用Activity做到这一点上下文。

一个简单的方法来完成这一点是设置一个标志,当数据完成加载,当你的第一个屏幕启动它可以显示对话框,如果标志还没有设置。当数据加载时,您也可以发送Broadcast,以便您的Activity知道隐藏对话框。

0

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

如果加载需要一些时间(比方说,可以采取> 1秒)我建议你结合使用IntentServiceResultReceiver,而不是AsyncTask,因为它是一个更强大的模型(例如,与取向的变化没有问题)。

你可以看到在应用程序代码中的例子中,我开源:http://bit.ly/ZR2n8R

相关问题