【问题标题】:Skipped frames while using Async使用异步时跳过帧
【发布时间】:2016-07-14 20:31:12
【问题描述】:

我正在创建一个 android 应用程序,在其中将一些目标存储在 sqlite 数据库中。如果有新内容,我也会从在线 mysql 数据库中获取该内容。

因此,当主活动启动时,它会在列表视图中从 sqlite db 加载存储的数据,然后使用 Volley 执行 JsonObjectRequest。 (一个异步任务)

但在启动主要活动时我仍然收到以下错误

Skipped 88 frames!  The application may be doing too much work on its main thread.
Skipped 34 frames!  The application may be doing too much work on its main thread.

88 帧来自 sqlite 数据库,加载所有存储的数据。 因为当我向下滑动以刷新时,我只会执行 JsonObjectRequest 并得到大约 34 帧的错误。

我是否可能必须将 sqlite db 加载也放入 AsyncTask 中? 还是您有其他解决方案?

我很想听听你的意见。 提前致谢。

威尔扬

编辑:

我现在像这样把它放在异步中:

private class syncData extends AsyncTask<Void, Void, Void> {
    private KerntaakListAdapter adapter;

    public syncData(KerntaakListAdapter adapter) {
        this.adapter = adapter;
    }

    /**
     * The system calls this to perform work in a worker thread and
     * delivers it the parameters given to AsyncTask.execute()
     */
    @Override
    protected Void doInBackground(Void... params) {
        dataSource.syncData(swipeRefreshLayout);
        return null;
    }

    /**
     * The system calls this to perform work in the UI thread and delivers
     * the result from doInBackground()
     */
    protected void onPostExecute(String result) {
        adapter.notifyDataSetChanged();
    }
}

然后用这个来触发它:

new syncData(adapter).execute();

但它仍然给我一个跳帧错误。虽然帧数减少了一些..

【问题讨论】:

  • 所以你也应该尝试在一个单独的线程中读取你的数据库;但您的应用中可能还有其他原因导致丢帧

标签: android sqlite android-asynctask android-volley


【解决方案1】:

我是否可能必须将 sqlite db 加载也放入 AsyncTask 中?还是您有其他解决方案?

是的,默认情况下,所有数据库操作都在 UI 线程上执行,这将导致跳帧。

您应该在后台线程上执行查询。使用最适合您的任何东西,它可以是 AsyncTask 甚至是 java Thread

我建议使用Loader 框架进行选择查询,因为加载器管理器有一个非常方便的生命周期附加到活动。它们还允许您监控基础数据并在通过ContentObservers 更改后对其进行更新。

如果您使用ContentProvider,如果您需要插入、更新或删除等其他查询,也可以查看AsyncQueryHandler

【讨论】:

  • 谢谢小费!我试过了,但还没有帮助。请阅读我在问题中的编辑以获取更多信息。
  • 抱歉,您显示的代码看起来非常好。如果您仍然有跳帧,则意味着问题出在其他地方。继续查看您可能在 UI 线程上做太多工作的地方。也许一些可以移动到后台的计算,加载数据,也许视图层次结构效率低下并且可以改进..看看stackoverflow.com/questions/14678593/…并继续寻找..祝你好运:)
  • 如果您找到根本原因但仍不知道如何解决,您可以更新/发布新问题。到目前为止,它看起来不错。
  • 感谢您的反馈。我有一个大型数据库类,其中包含用于从数据库读取和创建的各种函数等。那么我现在是否必须将该类中的每个函数都放在 AsyncTask 中? :o
  • 这取决于您的应用需求。通常最好使用加载器进行选择查询,使用线程进行插入、更新和删除。 AsyncTask 也可以。但在这样做之前,我会先测量性能,以确保您确实需要这种改进。后台线程将为您提供更好的性能,但如果您的数据库查询足够快,它可能不会引起注意。首先检查此链接:stackoverflow.com/questions/5047378/…
猜你喜欢
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多