zoukankan      html  css  js  c++  java
  • Android中UI线程与worker线程的通信方法

    在安卓开发中,线程是十分重要的,几乎你能看到的所有的界面或者功能都是通过线程来完成的。安卓中的线程又分UI线程和工作线程。其中UI线程主要负责和用户交互(说白了就你你在安坐上看到的界面,点击或者拖动这样一些效果);而其它线程出现的主要目的是为UI线程服务。

    一般而言,用户新建线程的目的是为了做一些计算或者进行一些IO操作来处理用户的需求。但是由于UI线程和其它线程是两个线程,不能使用一般的在同一个线程间变量通信的方式来进行数据传递。只好令找解决办法,目前我发现了又如下方法可以解决这个问题:

    方法一:使用final关键字:在新线程中使用UI线程中定义的变量

    将想要被新线程使用的变量用final关键字修饰后传入新线程中,就能在新线程中使用该变量的值,则此时的数据传递方式是:UI线程 --》 新线程。具体的代码实现如下:

    final String flag = "hello android thread";
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(res);
        }
    }).start();
    

    方法二:使用handler进行线程之间的通信

    实现原理:新线程向主线程发消息,主线程处理消息(有点类似与windows的消息处理机制)。具体的实现方式如下:

    final Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            System.out.println("收到来自worker线程的消息:" + msg.toString())
        }
    };
    new Thread(new Runnable() {
        @Override
        public void run() {
            Message message = handler.obtainMessage();
            message.obj = "hello android thread;
            handler.sendMessage(message);  // 向UI线程发送消息
        }
    }).start();
    

    个人推荐使用第二种方法进行通信。因为在安卓的最新版本中是不允许新线程修改UI线程中的组件状态的,使用handler的机制就避免了在新线程直接修改UI线程中的组件,而可以让UI线程自己进行组件的修改。

  • 相关阅读:
    进入黑马day4Serlet与Tomcat
    进入黑马day3HTTP协议与tomcat协议
    进入黑马day1XML简单学习
    进入黑马day2解析xml三种方法(2)sax解析器解析
    进入黑马day3xml三种解析方法比较
    进入黑马day2解析xml三种方法(1)jaxp解析
    进入黑马day2解析xml三种方法(3)dom4j解析器
    进入黑马day1JunitTest测试
    进入黑马day1关于云计算
    系统分析入门
  • 原文地址:https://www.cnblogs.com/finlu/p/11643468.html
Copyright © 2011-2022 走看看