Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从Sqlite游标创建Pojo类花费了太多时间_Android_Performance_Android Sqlite_Android Recyclerview_Database Performance - Fatal编程技术网

Android 从Sqlite游标创建Pojo类花费了太多时间

Android 从Sqlite游标创建Pojo类花费了太多时间,android,performance,android-sqlite,android-recyclerview,database-performance,Android,Performance,Android Sqlite,Android Recyclerview,Database Performance,我的查询执行时间小于3毫秒。但问题是,我正在从查询执行中获得的游标创建一个pojo类对象。此对象创建和设置字段值花费的时间太长,超过140毫秒。Pojo类有大约36个字段。有没有解决这个问题的建议 谢谢您正在实例化多少个对象? 36个字段没有看到太多 如果有许多对象,可以在单独的线程中实例化它们。当然,您必须设置某种回调来确定何时加载所有内容我知道c.getColumnIndex()方法需要更多时间。我所知道的加快速度的最佳方法如下: Cursor c = null; try { c =

我的查询执行时间小于3毫秒。但问题是,我正在从查询执行中获得的游标创建一个pojo类对象。此对象创建和设置字段值花费的时间太长,超过140毫秒。Pojo类有大约36个字段。有没有解决这个问题的建议


谢谢

您正在实例化多少个对象? 36个字段没有看到太多


如果有许多对象,可以在单独的线程中实例化它们。当然,您必须设置某种回调来确定何时加载所有内容

我知道
c.getColumnIndex()
方法需要更多时间。我所知道的加快速度的最佳方法如下:

Cursor c = null;
try {
    c = db.query(......);
    if(c != null) {

        int channelIdIndex = c.getColumnIndex(OptimizedMessage.CHANNEL_ID);
        int clientIdIndex = c.getColumnIndex(OptimizedMessage.CLIENT_ID);

        while (c.moveToNext()) {
            OptimizedMessage newMessage = new OptimizedMessage();
            newMessage.setChannelId(c.getLong(channelIdIndex));
            newMessage.setClientId(c.getLong(clientIdIndex));

            messages.add(newMessage);
        }
    }
} finally {
    if (c != null) {
        c.close();
    }
}

您可以看到,
c.getColumnIndex()
方法只使用了一次。

我认为您可以使用postDelayed处理程序来更改执行时间。您可以使用CursorLoader。我已经尝试了您建议的解决方案。但我仍然在日志中看到相同的消息(即应用程序在主线程中做了太多工作)。得到结果后,我正在更新适配器。我的意思是,我正在将所有项目添加到适配器中使用的Arraylist中,并在runOnUiThread中调用notifydataSetChanged()方法。如果我不调用此方法,我在日志中看不到任何消息。我也尝试过notifyItemInserted(),但结果相同。notifyDatasetChanged方法应该在主线程中调用,对吗?我已经尝试了您建议的解决方案。但我仍然在日志中看到相同的消息(即应用程序在主线程中做了太多工作)。得到结果后,我正在更新适配器。我的意思是,我正在将所有项目添加到适配器中使用的Arraylist中,并在runOnUiThread中调用notifydataSetChanged()方法。如果我不调用此方法,我在日志中看不到任何消息。我也尝试过notifyItemInserted(),但结果相同。notifyDatasetChanged方法应该在主线程中调用,对吗?是的,但是我认为您的问题不在于POJO的创建。这是另外一回事。请尝试使用自定义加载程序,您可以在后台线程中构建所有内容,并在适配器端使用ViewHolder模式。这是推荐的方法。