情景:
联系人界面注册一个广播,用来监听数据库中联系人发生变化,然后起一个线程从数据库中获取联系人数据,更新页面。
问题:
当连续有100个广播过来时,出现以下问题:
1.首先可能会出现cursor异常
原因:可能我正在某个线程中操作cursor,此时,突然cursor在另外个线程中被重新赋值,因为cursor时全局变量,就会报cursor异常。
2.连续更新100次界面,用户在此期间不能操作
原因:每次监听到广播,都回去刷新界面,用户很难操作
解决思路:
首先,我想把原来的起一个线程换成一个单线程池来管理,这样不管多少广播,都只有一个线程在操作cursor,第一个问题就解决了。
但是,如果来一百个广播,刷新一百次界面就会很慢,明显不是我想要的,我就想如果来一百次广播,其实只要更新最后一次就可以了,前面的99次都是没有必要的,所以我就用一个count来计数,每次来广播的时候我就count++,一个线程结束时,count--,如果count=1的时候我再去更新界面,这样就解决了问题。
加上两断代码对比一下:
原来的:
/**
* 另起一个线程从数据库获取最新好友列表
*/
private void updateFriends() {
new Thread(new Runnable() {
@Override
public void run() {
<pre name="code" class="java"><span style="white-space:pre"> </span>db.open();
cursor = db.friendsCursorGet();
alFriendsTemp.clear();
while (cursor.moveToNext()) {
ObjFriend friend = new ObjFriend();
friend.setFriend_id(cursor.getString(0));
friend.setLoginId(cursor.getString(0));
friend.setName(cursor.getString(1));
friend.setNickName(cursor.getString(2));
friend.setImgUrl(cursor.getString(3));
friend.setFriend_pinyin(cursor.getString(4));
friend.setSortKey(getFirstCharacter(friend
.getFriend_pinyin()));
alFriendsTemp.add(friend);
}
handler.sendEmptyMessage(0);
}}).start();}
修改后的:
/**
* 另起一个线程从数据库获取最新好友列表
*/
private void updateFriends() {
count++;
executorService.execute(new Runnable() {
@Override
public void run() {
if (count == 1) {
db.open();
cursor = db.friendsCursorGet();
alFriendsTemp.clear();
while (cursor.moveToNext()) {
ObjFriend friend = new ObjFriend();
friend.setFriend_id(cursor.getString(0));
friend.setLoginId(cursor.getString(0));
friend.setName(cursor.getString(1));
friend.setNickName(cursor.getString(2));
friend.setImgUrl(cursor.getString(3));
friend.setFriend_pinyin(cursor.getString(4));
friend.setSortKey(getFirstCharacter(friend
.getFriend_pinyin()));
alFriendsTemp.add(friend);
}
handler.sendEmptyMessage(0);
}
count--;
}
});
}