关闭

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

标签: android异步AsyncTask
876人阅读 评论(0) 收藏 举报
分类:

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是多线程吗?
不是,见前面的定义

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

多次调用异步任务(AsyncTask)时出现的问题

最近在做一个项目,在一个Activity中多次调用AsyncTask时出现了问题
  • matteozuo
  • matteozuo
  • 2014-10-24 11:00
  • 2554

java电商面试介绍(不完整版)

在青岛做了两年开发,大大小小参与过三个项目的开发,一个是某公司内部的人员管理系统,一个是物流项目,最近做的是一个电商项目。 前两个项目采用的是ssh框架搭建的,最近的项目采用的是ssm框架搭建的。在...
  • xue_mind
  • xue_mind
  • 2016-10-28 19:27
  • 11338

Android中同步与异步的问题

android 只有UI线程可以刷新界面,其他副线程不行,这样就需要副线程通过通信消息修改刷新和修改界面。  有2种方式可以实现:  AsyncTask,Handle  AsyncTask  an...
  • SDDDLLL
  • SDDDLLL
  • 2016-04-02 23:29
  • 5029

Android中的AsyncTask异步任务的简单介绍

事件原由:很多耗时的资源在安卓客户端加载时,必须要开启一个新的线程去操作维护,而如果直接在主线程中加载的话,客户端会直接报出异常,导致程序不能正常使用,而子线程无法直接更新UI,因此客户端提供了   ...
  • w_yunlong
  • w_yunlong
  • 2015-12-29 11:56
  • 1510

Android平台实战CRM客户关系管理(AChartEngine统计图表、异步任务、系统性能优化)

  • 2017-11-09 15:42
  • 17.96MB
  • 下载

Android异步任务处理之AsyncTaskLoader的使用

  • 2016-05-27 16:49
  • 18.77MB
  • 下载

Android异步任务AsyncTask实例源码

  • 2016-12-27 10:53
  • 26.27MB
  • 下载

Android多线程及异步任务消息处理机制 一 Handler的使用

  • 2014-08-26 12:39
  • 3.21MB
  • 下载

Android的AsyncTask异步任务

  • 2014-09-05 15:05
  • 20KB
  • 下载

动手学Android之十——异步任务例子程序

  • 2014-05-16 23:56
  • 1.46MB
  • 下载
    个人资料
    • 访问:152737次
    • 积分:3268
    • 等级:
    • 排名:第12042名
    • 原创:209篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    博客专栏
    最新评论