浅析 - Android异步操作

原创 2016年08月28日 21:32:28

尊重每个人的付出,转载请点这里:http://blog.csdn.net/hanj456/article/details/52347976

异步操作

要点:理解thread,handle,runnable,message,looper的作用以及它们之间的关系。

    什么是异步操作?简单来说就是在主线程中新开线程进行的操作;
    为什么需要异步操作?大家知道Android设计的时候是不允许在UiThread之外进行UI操作的,同时也不允许在主线程内执行耗时操作,但是这些都是开发中经常会遇到的问题,那么怎么解决这一点呢?这就涉及到下面提到的几个概念:
    thread:android中线程的意思,它是CPU调度资源的基本单位,执行所有的动作 ;
    runnable:一个接口,里面只有一个抽象方法run();
    message:android中的消息处理机制中的一员,用来传递数据;
    looper:专门用来操作操作message的,它和主线程是相互绑定的;
    handle:可以把它理解为子线程和Looper之间的桥梁;
    弄清楚这几个概念就不难发现Android是怎么完成主线程只负责UI操作,子线程负责耗时操作的分工的:首先当主线程MainThread中需要进行耗时操作的时候新开一条子线程childThread,而childThread的操作是在runnable接口中run()方法里实现的,完成之后需要将结果传递到主线程,这时候想到了Looper和message,但使用它们需要借助handle这个桥梁,于是我们就通过handle来操作Looper将子线程中的数据封装到message中传递到主线程了。

使用示例:

Handle handle = new Handle();
new Thread(new Runnable(){
  @Override
    public void run() {
        final Bitmap bitmap = downloadImage(imageUrl);
        handle.post(new Runnable(){
            public void run() {
              mIv.setImageBitmap(bitmap);
            }
        });
    }
}).start();

以上是异步操作的一个基本思路,像Android提供的runOnUiThread()方法其实就是讲handle这一步进行了封装,简化了一点操作步骤。但是这个方法还有一些缺陷,那就是如果只是一两个子线程没问题,但如果是需要新开一百条线程,那系统就吃不消了,为了解决所线程任务的需求,就引出一个新的概念:线程池(ThreadPool)。

什么是线程池?简单来说就是对线程的一个封装,线程池中由多个线程,当一个线程使用完后就放回线程池中,后面再次需要这个线程的时候重新取出来进行利用,避免了重复创建线程带来的额外开销,也方便了线程的统一管理。对于这种多线程的异步任务操作,Android为我们提供了一个封装好了线程池的类AsyncTask,将创建线程池和对线程池的管理过程都封装起来,我们只需要在onPostExecute()方法中执行对UI的操作,在doInBackground()方法中执行耗时操作就行,结构很简单。

使用示例:

 new AsyncTask<String,Void,Bitmap>(){
            @Override
            protected Bitmap doInBackground(String... params) {
                return downloadImage(params[0]);
            }

            @Override
            protected void onPostExecute(Bitmap bitmap) {
                mIv.setImageBitmap(bitmap);
            }
        }.execute(imageUrl);
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

浅析 - Android异步操作

​ >转载请注明出处:异步操作 要点:理解thread,handle,runnable,message,looper的作用以及它们之间的关系。 什么是异步操作?简单来说就是在主线程中新...

浅析C#异步操作

这里介绍开始C#异步操作后如果要阻止应用程序,可以直接调用 End 方法,这会阻止应用程序直到异步操作完成后再继续执行。 .NET Framework 为异步操作提供了两种设计模式:使用 IAs...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

Android AsyncTask异步操作分析

class TestTask extends AsyncTask { @Override protected Integer doInBackground( Integer ....

异步操作

1.什么是线程的阻塞 2.什么是异步操作 3.AsyncTask的基本使用方法 1.新建一个NetOperator的类,代码如下: package weo.cao.test; //模仿访问...

Android异步操作----AsyncTask类

在开发Android应用程序时必须遵守单线程模型的原则,尤其是开发有网络交互功能的应用,Android UI线程主要用来控制控件和触屏的操作。在单线程模型中必须要遵行两条原则:        1、 ...

Android 异步操作AsyncTask

既然AsyncTask如此之好,为什么还要用new Theard 和 Handler。 容我先转载考虑一下。。 ===========================================...

Android异步操作一(AsyncTask)

在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则:  1. 不要阻塞UI线程  2....

Android异步操作AsyncTask

转载请标明出处:http://blog.csdn.net/wu_wxc/article/details/53706042 本文出自【吴孝城的CSDN博客】 官网地址:https://develo...

Android 异步操作AsyncTask

异步的轻量级实现; AsynceTask简述: 1.功能类似于Handler,都是为了防止UI线程操作阻塞而衍生而来。 2.AsyncTask是Handler的一个轻量级实现,模型类似于...

Android异步操作AsyncTask

前面一篇是Thread+Handler更新UI操作, Android有提供一个相对轻量级的AsyncTask,主要用于一些简单的逻辑操作更新UI. public class ProAT extend...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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