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

情景:

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

问题:

当连续有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--;
			}
		});

	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值