您的位置:首页 > 移动开发 > Android开发

Android子线程给主线程发送消息

2016-04-21 16:04 399 查看
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 {

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: