AsyncTask的使用

原创 2015年07月07日 15:59:51

AsyncTask可以实现很简单的实现异步操作。
AsyncTask < Params, Progress, Progress >继承AsyncTask的时候需要定义三个参数的类型,第一个参数是调用异步方法时传进去的参数,如asyncTask.execute(1000);这里第一个参数使用的是Integer。第二个参数是调用publishProgress时传递的参数,改方法可以用于更新异步线程执行的进度,调用publishProgress会触发onProgressUpdate方法。第三个参数是异步方法执行结束后返回的结果。
AsyncTask可以重写5个方法:onPreExecute、onCancelled(onCancelled有两个方法,一个是不带参数的一个是带参数的,参数为执行结果)、doInBackground、onProgressUpdate、onPostExecute。
主线程使用asyncTask.execute来启动AsyncTask,启动后会先调用onPreExecute,可以执行一些初始化等的操作,然后会进行真正的异步方法doInBackground,在doInBackground中可以使用publishProgress触发onProgressUpdate方法。onPostExecute为异步方法结束后,处理结果的方法。使用asyncTask.cancel(true)可以中断异步方法,asyncTask.cancel(false)会运行异步方法运行结束。

以下是我自己写的测试代码:

package com.study.test;

import java.util.HashMap;
import java.util.Map;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

    private Button button;
    private ProgressBar progressBar;
    private TextView textView;
    private Button cancelled;
    MAsyncTask asyncTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button1);
        cancelled = (Button) findViewById(R.id.button2);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);
        textView = (TextView) findViewById(R.id.textView1);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                textView.setVisibility(View.GONE);
                asyncTask = new MAsyncTask();
                asyncTask.execute(1000);
            }
        });
        cancelled.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                asyncTask.cancel(true);
            }
        });
    }

    public class MAsyncTask extends
            AsyncTask<Integer, Integer, Map<String, Integer>> {
        long starttime;

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            starttime = System.currentTimeMillis();
        }

        @Override
        protected void onCancelled() {
            // TODO Auto-generated method stub
            super.onCancelled();
        }

        @SuppressLint("NewApi")
        @Override
        protected void onCancelled(Map<String, Integer> result) {
            // TODO Auto-generated method stub
            super.onCancelled(result);
        }

        @Override
        protected Map<String, Integer> doInBackground(Integer... params) {
            // TODO Auto-generated method stub
            long span = 0;
            while (span < params[0]) {
                span = System.currentTimeMillis() - starttime;
                publishProgress(Integer
                        .valueOf((int) (span * 1f / params[0] * 100)));

            }
            return new HashMap<String, Integer>();
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
            progressBar.setProgress(values[0]);
        }

        @Override
        protected void onPostExecute(Map<String, Integer> result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if (result != null) {
                textView.setVisibility(View.VISIBLE);
            }
        }

    }

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

android开发之AsyncTask的用法

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界...
  • yahohi
  • yahohi
  • 2013年06月05日 16:09
  • 21980

AsyncTask和Handler的优缺点比较

AsyncTask实现的原理和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口...
  • OnlyOneCoder
  • OnlyOneCoder
  • 2013年01月09日 10:03
  • 62032

AsyncTask简单实例

AsyncTask的简单例子使用场景使用AsyncTask可以方便的执行后台任务并且将后台任务的执行结果显示在UI上。你不需要操作Thread或Handler就可以完成耗时任务并且将操作结果显示在UI...
  • u014162857
  • u014162857
  • 2015年08月27日 15:40
  • 267

Android 结合实例学会AsyncTask的用法

doInBackground方法的形参对应的是AsyncTask的第一个参数,即参数类型要相同
  • dadaxiaoxiaode
  • dadaxiaoxiaode
  • 2014年07月31日 20:01
  • 6634

一个例子谈谈AsyncTask的用法

Android前端复习
  • Kaiwii
  • Kaiwii
  • 2014年03月19日 16:51
  • 3964

Android应用AsyncTask处理机制详解及源码分析

【工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果】1 背景Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知...
  • yanbober
  • yanbober
  • 2015年05月28日 16:02
  • 8143

AsyncTask的简单使用

这里不太完善,希望大神在评论里多多补充
  • peixiaopao
  • peixiaopao
  • 2017年07月20日 15:00
  • 632

使用AsyncTask防止Memory Leaks(内存泄漏)的正确姿势

1:合理的使用context–比如我们常使用的Toast,Service,最好使用getApplicationContext(),因为这些在activity结束的时候可能仍在运行 下图展示了一些场景...
  • sinat_35670989
  • sinat_35670989
  • 2017年01月06日 16:56
  • 633

AsyncTask 并行任务使用、测试

按照Android的文档,AsyncTask设计用来在UI线程执行短期后台操作。它使用起来非常方便,不用用户去维护threads 或者handlers。AsyncTask作为一个Thread 和Han...
  • yuxiaohui78
  • yuxiaohui78
  • 2015年01月23日 05:38
  • 2812

AsyncTask 使用和缺陷

一、AsyncTask的基本用法 由于AsyncTask是一个抽象类,所以如果我们想使用它,就必须要创建一个子类去继承它。在继承时我们可以为AsyncTask类指定三个泛型参数,这三个参数的用途如下:...
  • boyupeng
  • boyupeng
  • 2015年10月09日 17:06
  • 11579
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AsyncTask的使用
举报原因:
原因补充:

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