0

我有一个异步任务,它创建一个 HashMap 来创建一个适配器来填充 ListView。我有一个在 doInBackground 方法期间显示的进度对话框。在 onPostExecute() 方法中,我关闭了进度对话框并调用了一个方法,该方法使用保存在 doInBackground 方法中的项目列表填充我的列表视图。

这工作正常。但我注意到一些奇怪的事情:

我看到的问题是,如果我在进度对话框即将关闭时锁定屏幕(在 onPostExecute 中),即使列表视图中包含非空项目,列表视图也不会显示。我在 logcat 消息和调试时验证了它。

屏幕锁定(我按电源按钮一次)是否有可能阻塞 UI 线程?如何解决问题并确保 ListView 显示其项目?

onResume() 的代码:

@Override
protected void onResume(){
    super.onResume();
    if(MyAdapter !=null){
        pull_listView.setAdapter(MyAdapter);//pull_listView is listview
        MyAdapter.notifyDataSetChanged();//MyAdapter is the adapter

    }
}
4

2 回答 2

1

这种情况说明了使用 AsyncTask 进行后台处理的缺点。在某些情况下,IntentService 可能是更好的选择,尤其是当您认为后台工作需要一些时间时。AsyncTask 将后台工作与当前 Activity 联系起来,而 IntentService 则完全解耦。Android 培训课程Running in a Background Service向您展示了如何设置 IntentService、请求工作以及在工作完成时通知您的 Activity。将数据从 IntentService 传递到 Activity 有点复杂,但有一些选择。

于 2013-03-11T23:52:08.123 回答
0

onStop()将根据Activity Lifecycle在屏幕熄灭时调用。您可以override onStart()onResume()并在那里检查以查看您的数据是否已填充。如果没有,请填充。如果屏幕熄灭,您甚至可能想要覆盖“onStop()”以保存数据。

编辑

在这种特殊情况下,我会认为onResume()或者onStart()会很好,但onResume()通常是最安全的,因为它保证Activity在我给出的链接中显示为 illustrated 之前被调用。你想使用什么样的支票取决于你,取决于你如何处理一切。但是,如果您AsyncTask是您的类的内部类,Activity您可以简单地创建一个boolean member variable,例如在您的中将其boolean isDone=false;更改为 true,doInBackground()或者onPostExecute()onResume()知道数据已加载。如果它为假,那么您可以尝试再次获取数据。希望这是有道理的,可以帮助

于 2013-03-11T23:30:43.057 回答