Android:当电源按钮在AsyncTask期间锁定屏幕时,ListView不显示项目

时间:2013-03-11 23:24:35

标签: android sqlite listview asynchronous task

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

这很好用。但我注意到一些奇怪的事情:

我看到的问题是,如果我在取消进度对话框时锁定屏幕(在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

    }
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

当您的屏幕根据Activity Lifecycle熄灭时,将会调用

onStop()。您可以override onStart()onResume()并在此处检查您的数据是否已填充。如果没有,请填充。如果屏幕熄灭,你甚至可能想要覆盖'onStop()'来保存数据。

修改

在这种特殊情况下,我认为onResume()onStart()会很好,但onResume()通常是最安全的,因为它保证在Activity之前被调用在我给出的链接中显示为不明显。你想要使用的支票是什么取决于你,取决于你如何处理evrything。但是,如果您的AsyncTaskActivity课程的内部课程,则只需创建一个boolean member variable,然后boolean isDone=false;将此更改为doInBackground()onPostExecute()然后您的onResume()知道数据已加载。如果它是假的,那么你可以尝试再次获取数据。希望这是有道理的,可以帮助