进程和线程
进程:android应用程序的生命周期,由线程组成.
进程之间是独立的,通常叫不同的应用.
任何一个进程内部还有一个线程没有结束,那么这个进程没有结束。
任何一个应用都有一个主线程
java的并发基于线程的。
android 线程编程
相同:基于java来定义线程的
不同:基于linux os 来实现并发,主线程不同于java主线程
android 主线程也叫UI线程,它负责处理和UI相关的事件。
android UI线程(主线程)是单线程模型的特点:
1.当UI线程被阻塞时,超时会弹出ANR对话框。(Do not block the UI thread)
2.在UI线程以外的子线程不能访问UI对象,否则异常终止
示例:
1.xml布局
2.java代码
public class MainActivity extends Activity implements OnClickListener {
private Button btn1;
private Button btn2;
private TextView tView1;
private TextView tView2;
private TextView tView3;
private Button btn3;
private boolean active = false;//子线程活动标识位
int cnt1, cnt2, thread_cnt;
//使用Handler进行信息的接收和处理
class Myhandler extends Handler {
@Override
// 接收消息
public void handleMessage(Message msg) {
//更新UI
// 方法1
// t1.setText(String.valueOf(msg.what));
// 方法2
if (msg.what == 123) {
tView1.setText(String.valueOf(msg.arg1));
setTitle(msg.obj.toString() + msg.arg1);
}
}
}
Myhandler handler = new Myhandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn3 = (Button) findViewById(R.id.button3);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
tView1 = (TextView) findViewById(R.id.textView1);
tView2 = (TextView) findViewById(R.id.textView2);
tView3 = (TextView) findViewById(R.id.textView3);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
test1();//测试1,一个应用程序可以有无数个子线程,而不互相影响
break;
case R.id.button2:
test2();//测试2,对UI线程的操作不会影响子线程
break;
case R.id.button3:
test3();//测试3,使用异步延时,达到更新UI而不阻塞主线程
break;
default:
break;
}
}
private void test3() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.d("QL debug", ">>>>" + Thread.currentThread());
tView3.setText("boom,boom,boom......../.");
}
}, 5000);// 延迟5秒不会阻塞主线程 (异步延迟)
Log.d("QL debug", ">>>> test3() over.");
}
private void test1() {
thread_cnt++;
setTitle("应用创建了:" + thread_cnt + "个子线程");
new Thread() {
public void run() {
active = true;
while (active) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cnt1++;
// 发送消息
// 方法1
// handler.sendEmptyMessage(cnt1);
// 方法2 比new更好
Message msg = handler.obtainMessage();
msg.what = 123;
msg.arg1 = cnt1;
msg.obj = "I come from sub thread world";
// handler.sendMessage(msg);//发送信息方式1
msg.sendToTarget();//发送信息方式2
}
}
}.start();
}
private void test2() {
cnt2++;
tView2.setText(String.valueOf(cnt2));
}
@Override
protected void onDestroy() {
super.onDestroy();
active = false;
}
}