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线程自己进行组件的修改。

原文地址:https://www.cnblogs.com/finlu/p/11643468.html

时间: 2024-10-20 00:42:01

Android中UI线程与worker线程的通信方法的相关文章

【转载】Android中UI线程与后台线程交互设计的5种方法

原帖地址:http://www.cr173.com/html/19165_1.html 在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须要重新开启一个后台线程运行这些任务.然而,往往这些任务最终又会直接或者间接的需要访问和控制UI控件.例如访问网络获取数据,然后需要将这些数据处理显示出来.就出现了上面所说的情况.原本这是在正常不过的现象了,但是android规定除了UI线程外,其他线程都不可以对那些UI控件访问

Android中UI线程与后台线程交互设计的5种方法

我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一 些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须要重新开启一个后台线程运行这些任务.然而,往往这些任务最终又会直接或者 间接的需要访问和控制UI控件.例如访问网络获取数据,然后需要将这些数据处理显示出来.就出现了上面所说的情况.原本这是在正常不过的现象了,但是 android规定除了UI线程外,其他线程都不可以对那些UI控件访问和操控.为了解决

Android中Toast如何在子线程中调用

当我们在应用的子线程中调用Toast的时候,我们会发现编译时并没有问题,但是当我们运行时就会出现如下错误 大专栏  Android中Toast如何在子线程中调用l/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="image"/> 通常我们都会认为此问题是因为在子线程中去更新UI导致的,其实不然,因为我们观察所抛出的log信息即可发现不是更新UI导致的,那么是什么原因导致的此问题呢 原文地址:https://www.cnblog

关于GUI线程和worker线程

1.   所谓的worker线程,是指完全不牵扯到图形用户界面(GUI),纯粹做运算的线程. 2.   微软的多线程模型: Win32说明文件一再强调线程分为GUI线程和worker线程两种.GUI线程负责建造窗口以及处理主消息循环.Worker负责执行纯粹的运算工 作,如重新计算或重新编页等,这些运算工作会导致主线程的消息队列失去反应.一般而言,GUI线程绝不会去做那些不能够马上完成的工作. GUI线程的定义是:拥有消息队列的线程.任何一个特定窗口的消息总是被产生这一窗口的线程抓到并处理.所有

Android中UI设计的一些技巧!!!

出处:http://blog.csdn.net/android_tutor/article/details/5995759 大家好,今天给大家分享的是Android中UI设计的一些技巧,本节内容主要有两点:一是Android按钮(Button)的UI设计,二是:ListView以及GridView的UI设计. 按钮的状态: 我们一般搞UI设计,按钮通常有三个状态:normal(正常状态);focus(焦点状态),pressed(按下状态).如下图所示:                      

Android中通过WebView控件实现与JavaScript方法相互调用的地图应用

在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用android方法,在这里我个人觉得有点和DWR相似. 为了让大家容易理解,我写了一个简单的Demo,具体步骤如下: 第一步:新建一个Android工程,命名为WebViewDemo(这里我在assets里定义了一个html页面). 第二步:修改main.xml布局文件,增加了一个WebView控件还有But

(转)Android中的基类—抽取出来公共的方法

在Android中,一般来说一个应用会存在几十个页面,并且一个应用一般也会使用一个特定的主题,其中的页面的风格也是一致的,并且页面中的动画效果.页面的切换效果等也应该保持同样的风格,那么就需要一个基类,来完成页面的基础设置,这就是所谓的基类. 界面统一管理原因 当应用中的界面达到一定数量级时,如几十个界面,便于项目管理 提高界面的处理速度 避免由于多Activity导致的问题 界面统一管理的基础 当应用中的界面达到一定数量级时,为了能够让用户更容易操作上手,产品设计时会将界面显示风格进行统一.

Android中的基类—抽取出来公共的方法

在Android中,一般来说一个应用会存在几十个页面,并且一个应用一般也会使用一个特定的主题,其中的页面的风格也是一致的,并且页面中的动画效果.页面的切换效果等也应该保持同样的风格,那么就需要一个基类,来完成页面的基础设置,这就是所谓的基类. 界面统一管理原因 当应用中的界面达到一定数量级时,如几十个界面,便于项目管理 提高界面的处理速度 避免由于多Activity导致的问题 界面统一管理的基础 当应用中的界面达到一定数量级时,为了能够让用户更容易操作上手,产品设计时会将界面显示风格进行统一.

Android中UI线程与后台线程交互设计的6种方法

在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须要重新开启 一个后台线程运行这些任务.然而,往往这些任务最终又会直接或者间接的需要访问和控制UI控件.例如访问网络获取数据,然后需要将这些数据处理显示出来. 就出现了上面所说的情况.原本这是在正常不过的现象了,但是android规定除了UI线程外,其他线程都不可以对那些UI控件访问和操控.为了解决这个 问题,于是就引出了我们今天的话题.Android中后台线程如何