即时通讯课设Android端问题记录
前言
转眼间,就已经是大四学生,目前正在写毕设。Android 端没有系统的学习过,都是哪里不会查哪里,基本靠度娘。所以,在此记录下课设开发过程中,Android 端遇到的问题。
刷新UI
在主线程刷新 UI 是没有问题的,但往往我们有时需要在非主线程里刷新 UI,这时你会发现,直接进行刷新是不生效的。
首先,如果你不知道当前线程到底是属于主线程还是子线程,可以使用 Looper.getMainLooper() == Looper.myLooper()
进行判断。
判断出当前线程是子线程后,进行刷新 UI 的方法有:
1.通过 Handler
的方式通知主线程去刷新 UI
比如 handler.post(),或者 sendMessage 方式。
该方法需要注意,如果 Handler 是在主线程,则可以直接使用,如果是子线程,则需要获取主线程的 Looper 和 Queue,即 Handler handler = new Handler(Looper.getMainLooper())
2.主动到主线程里刷新 UI,比如
runOnUiThread(new Runnable() {
public void run() {
//更新UI
}
}
列表元素更新
像 notifyItemMoved
,notifyItemInserted
,notifyItemRemoved
元素的插入、移动、删除,仅仅是元素的结构性变化,只会改变元素的位置,但元素的数据依然被认为是最新的。所以如果想更新元素的数据,需要再调用 notifyItemChanged
。(参考源码方法上的注解)