android 线程数据传递参数,Android中的Thread+Handler更新UI,传递参数

很久没写笔记了,今天总结一下Android中多线程更新UI

如下通过按钮启动Thread,在主线程通过handler更新textView的数据变化

416472970f7d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

QQ图片20190122141120.gif

/**

* @author SuTongsheng

* @create 2019/1/22

* @Describe 在线程中更新UI

*/

public class ThreadUiActivity extends AppCompatActivity {

@BindView(R.id.tv_num)

TextView tvNum;

@BindView(R.id.bt_start)

Button btStart;

@BindView(R.id.bt_stop)

Button btStop;

private static final int NUM1 = 0x21;

private static final int NUM2 = 0x22;

private int tempNum = 0;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_thread_ui);

ButterKnife.bind(this);

}

@SuppressLint("HandlerLeak")

private Handler myHandle = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case NUM1:

tvNum.setText(msg.obj + "");

break;

case NUM2:

tempNum++;

tvNum.setText(tempNum + "");

break;

default:

break;

}

}

};

@OnClick({R.id.tv_num, R.id.bt_start, R.id.bt_stop})

public void onViewClicked(View view) {

switch (view.getId()) {

case R.id.tv_num:

break;

case R.id.bt_start:

// new MyThread().start();//1

// new Thread(new Runnable() {//2 匿名内部类

// @Override

// public void run() {

//

// }

// }).start();

new Thread(new MyRunnable()).start();//3

break;

case R.id.bt_stop:

new MyThread().start();//1

break;

}

}

public class MyRunnable implements Runnable {

@Override

public void run() {

for (int i = 0; i < 100; i++) {

try {

Thread.sleep(100);

Message message = new Message();//传递数据

message.what = NUM1;

message.obj = i;

myHandle.sendMessage(message);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

public class MyThread extends Thread {

@Override

public void run() {

for (int i = 0; i < 100; i++) {

try {

Thread.sleep(100);

myHandle.sendEmptyMessage(NUM2);//记录标志,区分标记更新UI

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

代码中创建子线程用了三种方法,继承Thread、实现Runnable和匿名内部类

更新UI用了通过handler.sendEmpty发送标记给UI主线程,通过标记识别更新处理UI。以及handler.sendMessage,通过创建message对象,赋值msg.what设置标记,msg.obj传递参数更新UI。

其中的XML文件如下

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".activity.ThreadUiActivity">

android:id="@+id/tv_num"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

android:id="@+id/bt_start"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="开始1" />

android:id="@+id/bt_stop"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="开始2" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值