Android线程机制和Java几乎一样,基本用法还是有两种
- 新建一个类继承Thread类
- 实现Runnable接口的方式定义一个线程
两种方法都需要覆写run方法,并用start方法启动
1.new MyTread().start();
2.new Thread(myThread).start();Thread的构造函数接收一个runnable参数,new出的 MyThread正是一个实现Runnable的对象
3还可以使用匿名内部类的方法
new Thread(new Runnable){
@Overrivd
public void run(){
//处理具体的逻辑
}
}
子线程给主线程发送消息
注意:这时不需要创建Looper,调用的是主线程的handler,主线程会自动调用Looper。
package com.example.mythread;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mButton, mButton1;
private TextView textView;
private TextView textView1;
//声明当前时间类 注意时间类的两种格式
private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd,hh-mm-ss");
// private String time;
//Handler处理机制 是用来处理消息的
private Handler handler = new Handler() {
//Handler里的handMessage方法
public void handleMessage(Message msg) {
//通过switch里的msg.what字段来判断传来的消息
switch (msg.what){
case 1:
String time= (String) msg.obj;
textView.setText(time);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.btn);
mButton1 = (Button) findViewById(R.id.btn2);
textView = (TextView) findViewById(R.id.text);
mButton.setOnClickListener(this);
mButton1.setOnClickListener(this);
}
//Button的点击事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
//注意这里,必须new一个Thread类,否则数据不更新
new Thread() {
//覆写Run方法
@Override
public void run() {
//要用一个while循坏
while (true) {
//更新时间
String time = format.format(new Date());
Message msg = handler.obtainMessage();
msg.obj = time;
msg.what = 1;
handler.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
break;
case R.id.btn2:
//刚开始这个地方运行的时候没错,但是在模拟器上显示的时间不更新
//出现的错误:忘了把它放到Thread类里
//
new Thread(){
@Override
public void run() {
//
while (true) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.d("正在运行的线程123",Thread.currentThread().getName());
String time = format.format(new Date());
textView.setText(time);
}
}, 1000);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
break;
}
}
class MyThread extends Thread {
}
}