【问题标题】:Android:ListView not displaying items when power button locks the screen during AsyncTaskAndroid:AsyncTask期间电源按钮锁定屏幕时ListView不显示项目
【发布时间】:2013-03-11 23:24:35
【问题描述】:

我有一个异步任务,它创建一个 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

    }
}

【问题讨论】:

    标签: android sqlite listview asynchronous task


    【解决方案1】:

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

    【讨论】:

    • 同意,但我将如何显示 listview onResume()。我有一个自定义基本适配器。
    【解决方案2】:

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

    编辑

    在这种特殊情况下,我认为onResume()onStart() 会很好,但onResume() 通常是最安全的,因为它可以保证在Activity 在我提供的链接中显示为插图之前被调用.您要使用哪种支票取决于您,并且取决于您如何处理所有事情。但是,如果您的 AsyncTask 是您的 Activity 类的内部类,则您可以简单地创建一个 boolean member variable,例如 boolean isDone=false; 在您的 doInBackground()onPostExecute() 中将其更改为 true,然后您的 onResume() 就知道了数据已加载。如果它为假,那么您可以尝试再次获取数据。希望这是有道理的,可以帮助

    【讨论】:

    • 在 onStart() 或 onResume() 中,如何检查是否填充了列表视图?这是空检查还是我检查适配器大小?
    • 我已经编辑了我的答案。试试看它是否适合你
    • 我在 onResume() 中尝试了你的建议。看来我的适配器中有数据。我可以看到它加载了项目(MyAdapter.getCount() > 0),我调用了一个填充列表视图的方法。我仍然看不到它被填充。我要重新加载布局吗?
    • 您可以尝试在您的adapter 上拨打notifyDataSetChanged()
    • 我会调试你的getView() 方法,看看你的行中的Views 是否有值。你得到任何错误还是只是一个空白列表?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多