Android-异步任务介绍及面试题

Android-异步任务

一 什么是AsyncTask

Android为了减低异步操作的开发难度,结合Handle和线程池,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,

顾名思义就是异步任务,他具有可以在后台执行耗时操作,同时可以将

执行的进度与UI进行同步的优点

因为Handle实际上就是两个线程之间的桥梁,但是数据的传递是单向的

Handle机制如下图:

而AsyncTask机制如下:

二 如何使用AsyncTask

AsyncTask定义三种泛型类型Params,Progress和Result:

Params:启动任务执行的输入参数,比如HTTP请求的URL

Progress:后台任务执行的百分比

Result:后台执行任务最终返回的结果,比如String

三 AsyncTask的主要方法:

必选方法:

doInBackground(Params…)

后台执行,比较耗时的操作都可以放在这里。

注意这里不能直接操作URL,此方法在后台线程执行,完成任务的主要工作

通常需要较长的时间。在执行的过程中可以调用publicProgress来更新进度条

onPostExecute(Result)

相当于handle处理UI的方式,在这里面可以使用doInBackground方法得到的结果处理操作UI

此方法在主线程执行,执行的结果作为此方法的参数返回值

可选方法:

onProgressUpdate(Progress…)

可以使用进度条增加用户体验,此方法在主线程执行,用于显示进度对话框

onPreExecute()

这是最终用户调用Execute时的接口,当任务执行之前开始调用的方法,可以在这里显示进度条的对话框

onCanceled()

用户调用取消时,要做的操作

AsyncTask的三个状态:Pending,runing,finish

四 AsyncTask的实现原理

1,AsyncTask为何必须在主线程中创建:

因为会用到sHandle

private static final InternalHandler sHandler = new InternalHandler();

该变量为静态变量,每次使用前都会建立,所以若不设定在主线程中创建,

则会产生很多的Task,系统返回的时候不确定返回哪一个

2,execute只能调用一次并且必须在主线程中执行

**3,自己不要调用**onPreExecute(),onPostExecute(),doInBackGround(),onProgressUpdate()这些方法

由系统自行调用

附上AsyncTask源代码:

http://pan.baidu.com/s/1hq6c95i

4,使用场合

使用AsyncTask:任务可以被终止,并需要不断和使用

使用Handle:任务需要多次重复执行,并且和UI交互较少时

四 检测程序是否需要使用多线程或AsyncTask

常用到的类如下图:

检测代码如下,结果是程序启动弹出对话框

package com.chengzhi.androidstrictmode;
import java.io.OutputStream;
import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy.Builder;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.view.Menu;

@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@SuppressLint("NewApi")
public class MainActivity extends Activity
{
    //开发者模式
    private static final boolean DEVELOPER_MODE = true;
    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        //检测代码
        if (DEVELOPER_MODE)
        {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                      .detectDiskReads()
                      .detectDiskWrites()
                      .detectNetwork()
                      .penaltyDialog()
                      .build());
             //这个代码也可以
            /*StrictMode.ThreadPolicy _policy = new StrictMode.ThreadPolicy.Builder()
            .detectAll().penaltyDeath().detectDiskReads().detectDiskWrites().detectNetwork().build();

            StrictMode.setThreadPolicy(_policy);
         */
        }
        super.onCreate(savedInstanceState);

        processIoAction();

    }
    //在主线程中创建文件流会引发StrictMode的异常
    private void processIoAction()
    {
        OutputStream out = null;
        try
        {
            out = openFileOutput("test", MODE_WORLD_WRITEABLE);
            out.write(0);
        } catch (Exception e)
        {
            // TODO: handle exception
            e.printStackTrace();
        }finally
        {
            try
            {
                out.close();
            } catch (Exception e2)
            {
                // TODO: handle exception
            }
        }

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

面试题:

1,Handle和AsyncTask谁更加占用资源

AsyncTask多余Handle

AsyncTask:Handle 线程池(比Handle多创建一个线程池)

Handle:Handle

所以AsyncTask内存占用更多

2,AsyncTask是多线程吗?

不是,见前面的定义

版权声明:欢迎交流,QQ872785786

时间: 2024-10-27 02:09:24

Android-异步任务介绍及面试题的相关文章

Android异步消息传递机制源码分析&&相关知识常被问的面试题

1.Android异步消息传递机制有以下两个方式:(异步消息传递来解决线程通信问题) handler 和 AsyncTask 2.handler官方解释的用途: 1).定时任务:通过handler.postDelay(Runnable r, time)来在指定时间执行msg. 2).线程间通信:在执行较为耗时操作的时候,在子线程中执行耗时任务,然后handler(主线程的)把执行的结果通过sendmessage的方式发送给UI线程去执行用于更新UI. 3.handler源码分析 一.在Activ

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L

Android异步加载全解析之Bitmap

Android异步加载全解析之Bitmap 在这篇文章中,我们分析了Android在对大图处理时的一些策略--Android异步加载全解析之大图处理  戳我戳我 那么在这篇中,我们来对图像--Bitmap进行一个更加细致的分析,掌握Bitmap的点点滴滴. 引入 Bitmap这玩意儿号称Android App头号杀手,特别是3.0之前的版本,简直就是皇帝般的存在,碰不得.摔不得.虽然后面的版本Android对Bitmap的管理也进行了一系列的优化,但是它依然是非常难处理的一个东西.在Androi

我的Android第三章:Android的组件介绍

小编摘录了Android文档介绍Android四大组件的基本内容,感觉文档的内容写的很详细所以小编将它写入了博客 Android 使用Java语言开发.Android SDK 工具编译代码-以及任意数据并连同相关资源打包进一个Android 包内,它是一个以.apk 为后缀的压缩文件. 一个 .apk 文件中的 所有代码就是一个程序.这个.apk文件就用于在Android设备上安装这个程序. 一旦安装成功,这个Android程序就拥有了自己独立的运行沙盒(沙盒是在受限的安全环境中运行应用程序的一

Android异步消息处理机制(3)asyncTask基本使用

本文翻译自android官方文档,结合自己测试,整理如下. 概述 AsyncTask抽象类,翻译过来就是异步任务,能够合理并方便的使用UI线程.该类可以实现将后台操作结果显示在UI线程中,而不需要我们自己实现子线程或者handler(当然它内部也是借助这两者实现的). 虽然AsyncTask可以提供后台运行并将结果显示在UI上,但是理想情况应该是后台操作最多只能是几秒钟,若要执行长时间的操作强烈建议使用java中的Executor,ThreadPoolExecutor,FutureTask等.

Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Android中的Looper , Handler , Message有什么关系?本篇博客目的首先为大家从源码角度介绍3者关系,然后给出一个容易记忆的结论. 1. 概述 Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念.那么什么叫异步消息处理线程呢?异步

Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面: 即如何使用Thread+Handler的方式从非UI线程发送界面更新消息到UI线程. 概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),

Android Phone设计介绍

Android Phone设计介绍 在Android之rild进程启动源码分析一文中已经详细介绍了Android的电话系统架构设计,并对rild进程进行了详细的剖析.native层的rild进程负责与底层modem设备交互,比如向modem发送AT命令.从modem中接收消息,同时实时监控modem的状态:作为三层架构设计的Android电话系统:客户端的framework.服务端的rild.modem设备,rild进程还需要接收来自客户端的命令消息,将客户端的需求转发给modem设备,实现对m

[学习总结]6、Android异步消息处理机制完全解析,带你从源码的角度彻底理解

开始进入正题,我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃.相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一个Message对象,然后借助Handler发送出去,之后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作就不会再出现崩溃了. 这种处理方式被称为异步消息处理线程,虽然我相信大家都会用,可是你知道它背后的原理是什么样的吗?今天我们就来一起

【转载】Android异步处理系列文章

本博文地址:http://blog.csdn.net/mylzc/article/details/6777767 转载请注明出处. 为了给用户带来良好的交互体验,在Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 本系列文章由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 (入门) 介绍如何使用Thread+Handler的方