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

我应该用我onCreate的第一个方法做所有的加载Activity吗?当我确实想在加载我的东西之前阻止 UI时,如何防止 ANR ?

4

5 回答 5

1

你不应该让你的应用程序冻结。绝不。进行加载AsyncTask并向用户显示一些进度,为用户添加取消加载的选项。如果没有数据没用,请通知用户等待此过程完成,如果用户确认,则重新启动,否则退出应用程序。

于 2013-04-29T08:39:04.883 回答
0

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

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

阅读让您的应用保持响应以了解更多详细信息。

于 2013-04-29T08:12:18.713 回答
0

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

于 2013-04-29T08:09:24.220 回答
0

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

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

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

于 2013-04-29T08:53:43.600 回答
0

正如前面的答案所涵盖的那样,您最好将数据加载AsyncTask到尝试显示时崩溃的原因ProgressDialogApplication上下文无法创建 UI 元素,您需要使用Activity上下文来执行此操作。

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

于 2013-04-29T08:47:57.090 回答