线程间的通信模型
使用Handler来传递消息。
为什么要使用线程呢?
比如说发出一条网络请求时,考虑到网速等其他原因,服务器未必会立刻相应我们的请求,如果不将这类操作放在子线程里去运行,就会导致主线程被阻塞住,从而影响用户对软件的正常使用。
下面有一个关于Thread的应用
60秒倒计时
public class MainActivity extends Activity {
private Button mButton;
private int count=60;
private static final int TIME_DESC=0X23;
// 下面是一个匿名内部类,作用和下面那个内部类是一样的
private Handler handler=new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case TIME_DESC:
String time = (String) msg.obj;
mButton.setText(time);
break;
}
}
};
// private MyHandler handler=new MyHandler();//初始化handler
//
// class MyHandler extends Handler {//这是一个内部类
// @Override
// public void handleMessage(Message msg) {
// switch (msg.what){
// case TIME_DESC:
// String time= (String) msg.obj;
// mButton.setText(time);
// break;
// }
// }
// }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count = 60;
new Thread(new Runnable() {
@Override
public void run() {
while (count>0){
count--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Message msg=handler.obtainMessage();不用每次都重新生成一个Message对象,可以直接用这个方法代替下面这条语句
Message msg=new Message();
msg.obj=count+"秒";
msg.what=TIME_DESC;
handler.sendMessage(msg);
}
}
}).start();
handler.sendEmptyMessage(TIME_DESC);
}
});
}
}
布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom=