Android中多线程编程(四)AsyncTask类的详细解释(附源码)

Android中多线程编程中AsyncTask类的详细解释

1.Android单线程模型

2.耗时操作放在非主线程中执行

Android主线程和子线程之间的通信封装类:AsyncTask类

1.子线程中更新UI

2.封装、简化异步操作。

3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的。必须等前边的线程执行完毕后,后边的线程才能执行。

AsyncTask类使用注意事项:

1.在UI线程中创建AsyncTask的实例

2.必须在UI线程中调用AsyncTask的execute()方法

3.重写的四个方法是系统自动调用的,不应手动调用。

4.每个AsyncTask只能被执行一次。多次调用将会引发异常。

AsyncTask类和Handler类在异步任务中的比较:

(1).AsyncTask:

优点:简单快捷。过程可控。

缺点:在多个异步任务处理进行UI更新的时候,就显得复杂起来。

(2).Handler类:

优点:结构清晰,功能定义明确。对于多个后台任务时,简单,清晰。

缺点:在单个后台异步处理时,代码相对来说过于多。

以下是从网络中获取图片并展示的例子:

(1).MainActivity.java类:

package com.chengdong.su.asynctaskdemo;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.ProgressBar;

import com.chengdong.su.asynctaskdemo.interfaces.AsyncT;
import com.chengdong.su.asynctaskdemo1.R;

public class MainActivity extends Activity {
    private ImageView mView = null;
    private ProgressBar mProgressBar = null;
    private String URL = "http://pic.nipic.com/2007-11-09/2007119122519868_2.jpg";
    private AsyncT mT = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        mT = new AsyncT(this);
        mT.execute(URL);
    }

    /**
     * Activity退出的时候,Task的任务也相应的退出
     */
    @Override
    protected void onPause() {
        super.onPause();
        if (mT != null && mT.getStatus() != AsyncTask.Status.FINISHED) {
            mT.cancel(true);
        }
    }

    private void init() {
        mView = (ImageView) findViewById(R.id.iv_show);
        mProgressBar = (ProgressBar) findViewById(R.id.pb_show);
    }

    public ImageView getView() {
        return mView;
    }

    public ProgressBar getProgressBar() {
        return mProgressBar;
    }

}

(2).AsyncT.java类:

package com.chengdong.su.asynctaskdemo.interfaces;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import com.chengdong.su.asynctaskdemo.MainActivity;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;

/**
 *
 * @author scd
 *
 */
public class AsyncT extends AsyncTask<String, Void, Bitmap> {
    private String TAG = "AsyncT";
    private MainActivity mContext;

    /**
     * 构造方法
     *
     * @param mContext
     */
    public AsyncT(MainActivity mContext) {
        super();
        this.mContext = mContext;
    }

    /**
     * 在主线程中运行
     */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // 显示
        mContext.getProgressBar().setVisibility(View.VISIBLE);

    }

    /**
     * 在子线程中运行
     */
    @Override
    protected Bitmap doInBackground(String... params) {
    /**
    ** 若要实现页面退出时,异步任务也要停止,那么此处就需要根据业务来        进行处理进行判断
       if(isCancelled()){

        }
        此处省略没实现。
    **/

        String url = params[0];
        HttpURLConnection connection = null;
        InputStream in = null;
        Bitmap bitmap = null;

        // 从网络中获取图片
        try {
            // 进行网络连接
            connection = (HttpURLConnection) new URL(url).openConnection();
            // 获得输入流
            in = connection.getInputStream();
            // 存放到缓存中
            BufferedInputStream bin = new BufferedInputStream(in);
            // 休眠
            Thread.sleep(3000);
            // 解析缓存中的输入流
            bitmap = BitmapFactory.decodeStream(bin);
            // 关闭数据流
            in.close();
            bin.close();
            return bitmap;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 在UI线程中运行
     */
    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        mContext.getProgressBar().setVisibility(View.GONE);
        mContext.getView().setImageBitmap(result);
    }

    /**
     * 在UI线程中运行
     */
    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

}

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

时间: 2024-12-28 06:52:25

Android中多线程编程(四)AsyncTask类的详细解释(附源码)的相关文章

微信公众平台开发教程(四) 实例入门:机器人(附源码)

微信公众平台开发教程(四) 实例入门:机器人(附源码) 上一篇文章,写了基本框架,可能很多人会觉得晕头转向,这里提供一个简单的例子来予以说明,希望能帮你解开谜团. 一.功能介绍 通过微信公众平台实现在线客服机器人功能.主要的功能包括:简单对话.查询天气等服务. 这里只是提供比较简单的功能,重在通过此实例来说明公众平台的具体研发过程.只是一个简单DEMO,如果需要的话可以在此基础上进行扩展. 当然后续我们还会推出比较复杂的应用实例. 二.具体实现 1.提供访问接口 这里不再赘述,参照上一章,微信公

在网站开中很有用的8个 jQuery 效果【附源码】

jQuery 作为最优秀 JavaScript 库之一,改变了很多人编写 JavaScript 的方式.它简化了 HTML 文档遍历,事件处理,动画和 Ajax 交互,而且有成千上万的成熟 jQuery 插件可供使用.看看下面这些惊人的功能和效果,我相信你会发现一些很有用的东西. 基于 jQuery 实现的 Ajax 异步分页 jPages 是一款非常不错的客户端分页插件,有很多特色,例如自动播放.按键翻页.延迟加载等等 源码下载      在线演示 老牌的响应式 jQuery 幻灯片效果 Sl

Android中多线程编程(三)Handler更新UI的方式

Handler更新UI的方式和原因以及遇到的问题 1.方式: 只能通过Handler来更新UI. 代码如下: package com.chengdong.su.handlerdemo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.

android列表收缩与展开仿QQ好友列表(非常详细,附源码)

好友QQ列表,可以展开,可以收起,在android中,以往用的比较多的是listview,虽然可以实现列表的展示,但在某些情况下,我们还是希望用到可以分组并实现收缩的列表,那就要用到android的ExpandableListView,今天研究了一下这个的用法,也参考了很多资料动手写了一个小demo,实现了基本的功能,下面直接上效果图以及源代码~! ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同的是,它可以有两层:每一层都能够被独立的展开并显示其子

Spring AOP实现方式四之注入式AspectJ切面【附源码】

现在我们要讲的是第四种AOP实现之注入式AspectJ切面 通过简单的配置就可以实现AOP了. 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /** * 谈恋爱接口 * * @author Administrator * */ public interface Love { /* * 谈恋爱方法 */ void fallInLove(); } .csharpcode, .csharpcode pre { font-size: sma

android tesseract-ocr实例教程(包含中文识别)(附源码)--转载

(转载注明出处:http://blog.csdn.net/buptgshengod) 1.介绍     快过年了,博主的新应用-屏幕取词之了老花镜的编码工作也在紧锣密鼓的进行中.下面分享一下这个应用中的核心功能ocr,也就是图片识词功能.先来看下我的实现效果.上图是在网上随便截下来的一个带有英文的页面,下图是我的应用的实现效果.   2.实现    (1)首先要下载我的源码和语言包,博客下方会给出地址.(源码设为10分,是想让大家珍惜别人的劳动成果)     (2)把代码中的lib中的两个文件夹

android tesseract-ocr实例教程(包含中文识别)(附源码)

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.介绍     快过年了,博主的新应用-屏幕取词之了老花镜的编码工作也在紧锣密鼓的进行中.下面分享一下这个应用中的核心功能ocr,也就是图片识词功能.先来看下我的实现效果.上图是在网上随便截下来的一个带有英文的页面,下图是我的应用的实现效果.   2.实现    (1)首先要下载我的源码和语言包,博客下方会给出地址.(源码设为10分,是想让大家珍惜别人的劳动成果)     (2)把代码中的lib中的两个文件

java中break和continue的区别详解(附源码)

序言 在自己学习java语言的过程中,很容易把break和continue的用法混淆.为了便于以后快速查阅及温习,在此特留学习笔记一份. 简述 在任何迭代语句的主体部分,都可以用break和continue控制循环的流程.其中,break用于强行退出循环,不执行循环中剩余的语句.而continue则停止执行当前迭代,然后退回循环起始处,开始下一次迭代. 源码 下面这个程序向大家展示了break和continue在for和while循环中的例子: package com.mufeng.thefou

Android 音视频深入 十 FFmpeg给视频加特效(附源码下载)

项目地址,求starhttps://github.com/979451341/Audio-and-video-learning-materials/tree/master/FFmpeg(AVfilter%E8%BF%87%E6%BB%A4%EF%BC%89 1.AVfilter结构体成员 这个特效要靠AVfilter来实现,首先说一下说AVfilter这个结构体的成员 / *过滤器定义.这定义了一个过滤器包含的垫,以及所有的 *用于与筛选器交互的回调函数. /typedef struct AVF