解决Hi-Tcc更新联系人页面crash问题

来源:互联网 发布:夺命呼软件下载 编辑:程序博客网 时间:2024/06/05 13:21

情景:

联系人界面注册一个广播,用来监听数据库中联系人发生变化,然后起一个线程从数据库中获取联系人数据,更新页面。

问题:

当连续有100个广播过来时,出现以下问题:

1.首先可能会出现cursor异常

原因:可能我正在某个线程中操作cursor,此时,突然cursor在另外个线程中被重新赋值,因为cursor时全局变量,就会报cursor异常。

2.连续更新100次界面,用户在此期间不能操作

原因:每次监听到广播,都回去刷新界面,用户很难操作


解决思路:

首先,我想把原来的起一个线程换成一个单线程池来管理,这样不管多少广播,都只有一个线程在操作cursor,第一个问题就解决了。

但是,如果来一百个广播,刷新一百次界面就会很慢,明显不是我想要的,我就想如果来一百次广播,其实只要更新最后一次就可以了,前面的99次都是没有必要的,所以我就用一个count来计数,每次来广播的时候我就count++,一个线程结束时,count--,如果count=1的时候我再去更新界面,这样就解决了问题。


加上两断代码对比一下:

原来的:

/** * 另起一个线程从数据库获取最新好友列表 */private void updateFriends() {new Thread(new Runnable() {@Overridepublic 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() {@Overridepublic 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--;}});}



0 0
原创粉丝点击