学习笔记(七)多线程开发

原创 2016年08月29日 10:01:24

相信大家在Java中都已经接触过线程,就是像一条线一样一次执行相关的操作,特点就是同步的,顺序进行的。
但是,Android和Java的线程有一点区别在于就是在子线程中不能对UI组件进行相关操作,Android中的所有组件的操作要求在主线程(UI线程)中进行。如果我们在主线程中进行过多的耗时操作,有可能导致线程卡死,超过5s,程序就会被系统杀死。因此,就要使用多线程,将一些复杂的耗时操作移动到其他的线程中去执行,提高程序的运行效率。

子线程的创建

Android在一开始就会自动创建一个主线程。Android和Java一样,可以使用Thread类来开辟一个新的线程。

new Thread(new Runnable() {
            @Override
            public void run() {
            //耗时操作  
            }
        }).start();

主线程与子线程的通信方式

  • Handler+Thread方式
    以前的学习中, 有关于Handler的详细解释;
    http://blog.csdn.net/bistusim/article/details/52152454
    handler发送Message消息,然后在主线程中的handler的回调方法中接受并处理消息。
  • runOnUiThread更新主线程
    Activity.runOnUiThread(Runnable);这是一个Activity的一个方法。把需要更新的UI代码创建在Runnable中。
 runOnUiThread(new Runnable() {
     @Override
     public void run() {
     //更新UI操作
     }
 });
 //源码
 public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }
  • View.post(Runnable)更新主线程
textview.post(new Runnable() {
                            @Override
                            public void run() {
//更新UI                            }
                        });
//源码
public boolean post(Runnable action) {
        final AttachInfo attachInfo = mAttachInfo;
        if (attachInfo != null) {
            return attachInfo.mHandler.post(action);
        }
        // Assume that post will succeed later
        ViewRootImpl.getRunQueue().post(action);
        return true;
    }
 //通过源码可以看出,以上两种方法实质上都是获得了UI线程的Handler,然后使用post(Runnable)进行相关的更新操作。
  • AsyncTask
    AsyncTask是Google提供的一个封装过的后台任务类,适用于简单的异步处理。
    使用时需要继承AsyncTask类,并且至少要重写两个方法;
    • doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。
    • onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回。

除了上面的两个必须重写的方法外,还有onPreExecute()方法,当任务执行之前开始调用此方法。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
- Params 启动任务执行的输入参数,比如HTTP请求的URL,或者String,Integer等。
- Progress 后台任务执行的百分比。
- Result 后台执行任务最终返回的结果,比如String。会传递给onPostExecute()方法。

线程安全

如果代码所在的进程中有多个子线程在同时运行,而这些子线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全。

老师还提到一个比较特别的方法,ProgressBar.setProgress()可以在子线程中直接使用,这看似违背了不能在子线程中进行更新UI的操作,但是看了源码发现,它实际还是获得了当前的UI线程进行更新UI操作。

版权声明:本文为博主原创文章,未经博主允许不得转载。

最优化学习笔记(十七)——拟牛顿法(3)

秩1修正公式    在秩1修正公式中,修正项为αkz(k)z(k)T,αk∈R,z(k)∈Rn\alpha_k\boldsymbol{z}^{(k)}\boldsymbol{z}^{(k)T}, \a...
  • chunyun0716
  • chunyun0716
  • 2017年01月08日 14:43
  • 466

JSP学习笔记七之Cookie

首先提一下http协议的无状态性,指的是服务器不会记住已经给它发过请求的客户端。每次收到请求都会认为是一个新的客户端发过来的。(即:服务器不会记住给他发过请求的客户端)。 所以这个时候我们就需要使用...
  • LULEI1217
  • LULEI1217
  • 2016年03月22日 13:44
  • 2042

多线程编程php

早期的php并不支持多线程编程,采用curl_muti系列族模拟实现多线程,到现在已经可以实现多线程编程,并且线程安全机制ZTS( zend thread safe)多线程安全就是保证多个线程安全存取...
  • qq_21034239
  • qq_21034239
  • 2016年12月30日 10:31
  • 347

MFC多线程开发学习笔记

32位Windows没有每个应用程序只有一个线程的限制。 MFC在CWinThread类中封装了可执行线程,在C++类中封装了事件,互斥和其他Win32线程同步对象。 MFC把线程分为两个类型:U...
  • mdifferent
  • mdifferent
  • 2011年09月27日 11:15
  • 896

Linux netfilter 学习笔记 之七 ip层netfilter的连接跟踪模块的概念及相关的数据结构分析

内核版本 2.6.16   连接跟踪(CONNTRACK)就是跟踪并且记录连接状态。包括 TCP 、UDP、ICMP  等协议类型的连接。其主要是判断该数据包是什么状态。根据数据包的源ip地址、目...
  • lickylin
  • lickylin
  • 2014年06月26日 00:13
  • 4039

人工智障学习笔记——机器学习(11)PCA降维

一.概念 Principal Component Analysis(PCA):主成分分析法,是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,即把原先的n个特征用...
  • sm9sun
  • sm9sun
  • 2017年12月09日 13:54
  • 765

多线程开发学习笔记(1)

pthread_join()和pthread_detach(thread_self())linux 线程有两种状态 joinable 和 unjoinable;当线程处在joinable状态,则线程自...
  • jpcfei
  • jpcfei
  • 2011年04月02日 10:10
  • 755

多线程开发

 引语随着计算机中央处理器主频的不断上升,能耗问题也成为当今一大主要问题,因为这个问题的出现,随即出现了双核处理器以及多核处理器,大大降低了计算机的能耗。但随之而来的问题是,如何充分发挥多核平台的处理...
  • complier2
  • complier2
  • 2007年07月07日 16:12
  • 910

多线程开发(中)

Thread、Looper与Handler到底啥关系?Handler到底是个啥?有没有自带Handler的Thread?本文将图文并茂向你展示这三者之间的关系,让你优雅的使用Handler做开发。...
  • anddlecn
  • anddlecn
  • 2016年06月08日 15:07
  • 7250

动漫人物之七大罪:ディアンヌ Diane 戴安娜 CV 悠木碧

ディアンヌ Diane 戴安娜 CV 悠木碧 嫉妒之罪(Serpent's Sin of Envy) CV:悠木碧 ◆身高:915cm(变小后165CM) ◆种族:巨人族(Giant)...
  • tomotayuki
  • tomotayuki
  • 2015年06月20日 19:31
  • 4223
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习笔记(七)多线程开发
举报原因:
原因补充:

(最多只允许输入30个字)