Android – Handle消息传递机制

前言

Android为了线程安全,并不会允许我们在UI线程外操作UI,很多时候我们做界面刷新都需要通过Handle来通知UI更新。当我们的子线程想修改Activity中的UI组件,我们可以新建一个Handle对象,通过这个对象向主线程发送消息。而我们发送的消息会先到主线程的MessageQueue进行等待,由Looper按先入先出的顺序取出,再根据Message对象的what属性进行分发给对应的Handle进行处理。

Handle怎么用?

  1. post(Runnable)
1
2
3
4
5
6
mHandler.post(new Runnable() {
@Override
public void run() {
mTextViewResult.setText("执行Handle的post方法成功");
}
});
  1. postDelayed(Runnable,long)

这里我们可以写一个类继承至Runnable,重写run方法,在里面处理UI更新,然后在主线程调用。

  1. sendMessage()

子线程sendMessage()传入一个Message对象,可以是int型,也可以为一个object对象,然后在主线程handleMessage(Message msg)里取出信息更新UI。

  1. sendMessageDelayed()

和上面大同小异。

Demo:https://github.com/Omooo/HandleDemo

四个按钮点击事件对应Handle的四种方法,也很简单清晰。

参考:

Android面试常客Handler详解

Android中的Handler, Looper, MessageQueue和Thread

最后

因为是看慕课网的课程来了解的Handle,学的并不深入。关于Looper还有MessageQueue的道理都懂,但是实际上我还没用到,我太菜了,深入之后再更新,留个坑吧。


对不起,RNG

四年了,逐梦之路未曾离弃。今年是靠近梦最近的一年,但是还是落寞了。我们知道尽力了,但是还是期待一个冠军,期待一句恭喜RNG,恭喜皇族。

或许我再也不会打LOL了,LPL加油,RNG加油。


Android – 内存泄漏

前言

又是一个经常听到的概念,又是一时忍不住想去了解它。内存泄露,即部分对象虽然已经不在使用,但是因为有root持有引用,所以并没有销毁,所占用的内存一直没有被释放。简单的来说就是程序在向系统申请分配内存空间后,在使用完毕后未释放,结果导致一直占据该内存单元。一两次发生影响不大,如果频繁发生,那么可用内存会逐渐不足,最终在某一次请求内存的时候发现内存不足而OOM(内存溢出:程序向系统申请的内存空间超出了系统能给的)。这里要明确一个概念,只有强引用会发生内存泄露,而弱引用因为其特殊机制,所以影响不大。(什么是强弱引用???我也不知道耶,QAQ 逃!先Mark下!下面会讲到。

more >>


非UI线程可以更新UI?

前言

我们都知道,不能在非UI线程中更新UI,但是今天再次接触Handle,实验的时候,发现了一个很奇妙的问题,于是记录一下。

1
2
3
4
5
6
7
8
9
10
11
12
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv_result);
new Thread(){
@Override
public void run() {
mTextView.setText("2333");
}
}.start();
}

你猜猜执行会怎么着?竟然不会Crash,但是以下代码就会Crash。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv_result);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2000);
mTextView.setText("2333");
} catch (InterruptedException e) {
e.printStackTrace();
}
// mTextView.setText("2333");
}
}.start();
}

难道说和线程休眠有关?也不会呀,休不休眠它还是在非UI线程之中呀。那问题出在哪里了呢?

more >>

现实告诉我:

保持好奇心,享受孤独。

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?