[android] 07_Android中消息机制

Android 4.0

Android中消息机制


Android中消息机制

多线程应用程序: 非常小心.
小心线程同步和互斥的问题.
 
恐龙快打游戏.
A线程 处理是不是吃了面包 汉堡 + 血 +100
B线程 处理挨打操作            - 血 -20
 
主线程更新UI
如果子线程也可以更新UI
 
google android系统为了解决线程同步和互斥问题,ui更新混乱.
规则: 只有主线程才能更新ui
 
 
android下的消息机制:
1.只有主线程才可以更新ui
2.子线程如果需要更新ui 必须发送消息给主线程
3.主线程得到消息后,才能更新界面.

 

核心代码:

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    // 1.在主线程创建一个handler 消息处理器
    private Handler handler = new Handler(){
 
        // 处理消息的方法
        public void handleMessage(android.os.Message msg) {
 
            // 3.消息放在消息队列里面之后,会被轮询器给取出来,调用handlemessage的方法处理这个消息
            // 这个代码 是在主线程里面运行的.
            int i = (Integer) msg.obj;
            // tv.setText(i);//int类型会报异常
            //问题:把一个int型业务数据的 设置setText()或者类似的方法中,这样Android系统就会主动去资源文件当中寻找, 但是它不是一个资源文件ID, 所以就会报出这个bug。
            // 解决:将int型业务数据,转换成String类型即可
            tv.setText("当前进度:" + i);
        };
    };
 
    private TextView tv;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        getMainLooper();
 
        tv = (TextView) findViewById(R.id.tv);
        new Thread() {
            public void run() {
 
                for (int i = 0; i < 100; i++) {
                    // 2.利用主线程的handler发送一条消息,消息会放在消息队列里面
                    Message msg = new Message();
                    msg.obj = i;
                    handler.sendMessage(msg);
                    // tv.setText("当前进度:"+i);
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
        }.start();
    }

}

大bug :

10-14 18:54:42.774: E/AndroidRuntime(9628): android.content.res.Resources$NotFoundException: String resource ID #0x0

public void handleMessage(Message msg) {
      int i = (Integer) msg.obj;
      tv.setText(i);
}
注意:这里的i是一个int,android会将其当做一个资源文件,到R中去找,但是找不到,所以报异常。
 
做Android应用开发的朋友有时候会遇到这样的Bug,,
android.content.res.Resources$NotFoundException: String resource ID #0x0 找不到资源文件ID #0x0
原因分析如下:
遇到这种情况,很有可能是把一个int型业务数据的 设置setText()或者类似的方法中, 这样Android系统就会主动去资源文件当中寻找, 但是它不是一个资源文件ID, 所以就会报出这个bug。 将int型业务数据,转换成String类型即可