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类型即可。
|