android初步ui线程案例,android基础---->子线程更新UI

和许多其他的GUI 库一样,Android 的UI 也是线程不安全的。也就是说,如果想要更新应用程序里的UI 元素,则必须在主线程中进行,否则就会出现异常。了解AsyncTask的用法,请参见我的博客:(android高级---->Asynctask的源码分析)今天我们就来学习一下有关UI更新的一些知识。

目录:

今天我们通过一个小案例,来说明更新UI的全部测试内容:项目结构如下

3518237

在子线程中更新UI

一、 在MainActivity.java的onCreate方法中做一些初始化工作,初始化textView

14be9136fee4904fc1f59703871f3e5f.gif

private TextView textView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView = (TextView) findViewById(R.id.textView);

}

7298ef47232bccad03facc5fe643ff66.gif

二、 点击threadUpdateUI按钮,触发在子线程中更新UI的事件

be9a7cd9065ee734e77ab23619ecc54c.gif

// 在子线程中更新UI

public void threadUpdateUI(View view) {

new Thread(new Runnable() {

@Override

public void run() {

textView.setText("I love you.");

}

}).start();

}

1ff102916fcebee86338d3b6b5c6c5d3.gif

三、 运行结果如下,说明在子线程中的确不能更新UI

日志打印结果:  Only the original thread that created a view hierarchy can touch its views.

测试真机崩溃:

3518237

用Handler机制实现UI的更新

一、 定义一个Handler,用于接收处理消息

539e9304f9eab91c5e60d8773feb73fa.gif

public static final int UPDATE_TEXT = 1;

private Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case UPDATE_TEXT:

textView.setText("I Love you.");

break;

default:

break;

}

}

}

e4f806aa2e35265c28e7965b7ff63566.gif

二、 点击按钮,触发在子线程中发送消息的事件

2fc9faa6205492c9bf661b3e41194b36.gif

// 用handler处理上述问题

public void handlerUpdate(View view) {

new Thread(new Runnable() {

@Override

public void run() {

Message message = new Message();

message.what = UPDATE_TEXT;

handler.sendMessage(message); // 将Message对象发送出去

}

}).start();

}

ff904e571251c2ff7786c768d14581d9.gif

结果正常,textView显示为:I love you

用AsyncTask机制实现UI的更新

一、 创建一个继承AsyncTask的内部类,命名为:MyAsynTask

b2ddced2bfa5aaa141db1c2b1aa03eba.gif

private class MyAsynTask extends AsyncTask {

@Override

protected Void doInBackground(Void... params) {

return null;

}

@Override

protected void onPostExecute(Void aVoid) {

textView.setText("I love you");

}

}

fdeb25be08105f1259be00e5dc7606d6.gif

二、 点击按钮,创建AsyncTask的实例,并调用execute方法:

// 用AsyncTask处理上述问题

public void asynTask(View view) {

MyAsynTask myAsynTask = new MyAsynTask();

myAsynTask.execute();

}

结果正常,textView显示为:I love you。

友情链接

关于AsyncTask类的详细使用,请参见我的博客           (android高级---->Asynctask的源码分析)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值