A 首先,cursor在读DB线程中必须执行moveToPosition()来达到预读的效果,否则会在主线程读DB造成延迟。所以要在子线程中读DB,而setCursor又要在主线程做,这就需要用handler之类的线程通信来实现,因为子线程不能直接更改listview的adapter使用的cursor,所以,DB中要有一个新的cursor来承载新数据,再通知主线程换掉adapter中的cursor并notifyDataSetChanged。换掉adapter中cursor后,应该在notify后,马上关闭旧cursor。当然这里可以做一个优化,即对cursor做一个引用计数,在activity生命周期结束时清理所有cursor。