android基础---->子线程更新UI


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

目录:

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

在子线程中更新UI

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

private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.textView);
}

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

// 在子线程中更新UI
public void threadUpdateUI(View view) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            textView.setText("I love you.");
        }
    }).start();
}

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

  • 日志打印结果: Only the original thread that created a view hierarchy can touch its views.
  • 测试真机崩溃:

用Handler机制实现UI的更新

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

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;
        }
    }
}

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

// 用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();
}

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

用AsyncTask机制实现UI的更新

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

private class MyAsynTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        textView.setText("I love you");
    }
}

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

// 用AsyncTask处理上述问题
public void asynTask(View view) {
    MyAsynTask myAsynTask = new MyAsynTask();
    myAsynTask.execute();
}

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

友情链接

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

作者:huhx
出处:www.cnblogs.com/huhx
格言:你尽力了,才有资格说自己的运气不好。
版权:本文版权归作者huhx和博客园共有,欢迎转载。未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。 优质内容筛选与推荐>>
1、Log file location for Oracle E-Business Suite R12
2、JAVASCRIPT判读IE是否禁用了Cookie
3、The Dole Queue
4、文件分配表FAT(File Allocation Table)
5、 Match.Groups正则表达式的中的高级应用,理解了Match.Groups你就可以利用正则表达式操作得到更多想要得到的结果


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn