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。
新建一个类继承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 { } }
相关文章推荐
- android 事件
- Android五子棋游戏程序完整实例分析
- Android studio:Groovy 与 Gradle 基础【三】
- Android学习资料整理(二)
- Android Studio :Android Studio 与 Gradle 深入【二】
- android 防止锁屏
- Android--JNI编程详解
- android 在Activity 之间传递数值
- Android Activity跳转到安卓市场
- Android 抽象布局介绍和简单的使用
- wamp2.4允许局域网访问,如Android模拟器和手机
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- 绘图机制
- Android 打包签名
- android开发--drawerLayout和toolbar的结合使用
- Android 4.4以上拍照或者从图库选择图片,获取图片路径
- AndroidStudio简单的apk混淆
- Android Volly源码分析之执行线程
- Android开发之nuwa热修复
- android自定义loding view(上)