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

Android线程机制和Java几乎一样,基本用法还是有两种

  1. 新建一个类继承Thread类
  2. 实现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 {

        }
    }

你可能感兴趣的:(Android子线程给主线程发送消息)