使用Async时跳过帧

时间:2016-07-14 20:31:12

标签: android sqlite android-asynctask android-volley

我正在创建一个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数据库加载也放在AsyncTask中? 或者你有其他解决方案吗?

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

Wiljan

编辑:

我现在把它放在像这样的Async中:

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();

但它仍然给我一个跳帧错误。虽然框架有点减少..

1 个答案:

答案 0 :(得分:1)

  

我是否可能必须将sqlite数据库加载也放在AsyncTask中?或者你有其他解决方案吗?

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

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

我建议使用Loader框架来选择查询,因为加载程序管理器具有附加到活动的非常方便的生命周期。它们还允许您监视基础数据,并在通过ContentObserver s。

进行更改后对其进行更新

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

相关问题