AsyncTask分析

AsyncTask分析

  1. 经典版异步任务

    public abstract class MyAsyncTask {
        private Handler handler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                onPostExecute();
            };
        };
    
        /**
         * 后台任务执行之前 提示用户的界面操作.
         */
        public abstract void onPreExecute();
    
        /**
         * 后台任务执行之后 更新界面的操作.
         */
        public abstract void onPostExecute();
    
        /**
         * 在后台执行的一个耗时的操作.
         */
        public abstract void doInBackground();
    
        public void execute(){
            //1. 耗时任务执行之前通知界面更新
            onPreExecute();
            new Thread(){
                public void run() {
                    doInBackground();
                    handler.sendEmptyMessage(0);
                };
            }.start();
    
        }
    }
  2. 谷歌异步任务
        new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    blackNumberInfos = dao.findByPage(startIndex, maxNumber);
                    return null;
                }
                @Override
                protected void onPreExecute() {
                    loading.setVisibility(View.VISIBLE);
                    super.onPreExecute();
                }
                @Override
                protected void onPostExecute(Void result) {
                    loading.setVisibility(View.INVISIBLE);
                    if (adapter == null) {// 第一次加载数据 数据适配器还不存在
                        adapter = new CallSmsAdapter();
                        lv_callsms_safe.setAdapter(adapter);
                    } else {// 有新的数据被添加进来.
                        adapter.notifyDataSetChanged();// 通知数据适配器 数据变化了.
                    }
                    super.onPostExecute(result);
                }
            }.execute(); 
    
    类的构造方法中接收三个参数,这里我们不用参数就都给它传Void,new出来AsyncTask类之后然后重写这三个方法,最后别忘了执行execute方法,其实它的内部和我们写的经典版的异步任务相同,也是里面写了一个在新的线程中去执行耗时的操作,然后用handler发送Message对象,主线程收到这个Message之后去执行onPostExecute中的内容。
    
        //AsyncTask<Params, Progress, Result> ,params 异步任务执行(doBackgroud方法)需要的参数这个参数的实参可以由execute()方法的参数传入,Progess 执行的进度,result是(doBackground方法)执行后的结果 
    
        new AsyncTask<String, Void, Boolean>() {
                ProgressDialog pd;
                @Override
                protected Boolean doInBackground(String... params) { //这里返回的就是执行的接口,这个返回的结果会传递给onPostExecute的参数
                    try {
                        String filename = params[0];//得到execute传入的参数
                        File file = new File(Environment.getExternalStorageDirectory(),filename);
                        FileOutputStream fos = new FileOutputStream(file);
                        SmsUtils.backUp(getApplicationContext(), fos, new BackUpStatusListener() {
                            public void onBackUpProcess(int process) {
                                pd.setProgress(process);
                            }
    
                            public void beforeBackup(int max) {
                                pd.setMax(max);
                            }
                        });
                        return true;
                    } catch (Exception e) {
                        e.printStackTrace();
                        return false;
                    }
                }
                @Override
                protected void onPreExecute() {
                    pd = new ProgressDialog(AtoolsActivity.this);
                    pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                    pd.setMessage("正在备份短信");
                    pd.show();
                    super.onPreExecute();
                }
                @Override
                protected void onPostExecute(Boolean result) {
                    pd.dismiss();
                    if(result){
                        Toast.makeText(getApplicationContext(), "备份成功", 0).show();
                    }else{
                        Toast.makeText(getApplicationContext(), "备份失败", 0).show();
                    }
                    super.onPostExecute(result);
                }
    
            }.execute("backup.xml"); //这里传入的参数就是doInBackgound中的参数,会传入到doInBackground中
    
    ProgressDialog有个方法
    incrementProgressBy(int num);方法,这个方法能够让进度条自动增加,如果参数为1就是进度条累加1。
    
    可以给ProgressDialog添加一个监听dismiss的监听器。pd.setOnDismisListener(DismisListener listener);让其在取消显示后做什么事

  • 邮箱 :[email protected]
  • Good Luck!
时间: 2024-11-06 23:18:05

AsyncTask分析的相关文章

Java AsyncTask 分析内部实现

sdk3.0前,使用内部的线程池,多线程并发执行.线程池大小等于5,最大达128 sdk3.0后,使用默认的serial线程池,执行完一个线程,再顺序执行下一个线程.sdk4.3时 线程池大小等于5,最大达128 sdk4.4后线程池大小等于 cpu count + 1,最大值为cpu count * 2 + 1 sdk3.0后有两种线程池的实现,默认为 Serial 线程池 public static final Executor SERIAL_EXECUTOR = new SerialExe

Android AsyncTask分析

---恢复内容开始--- 因为android的UI线程是不安全的,如果你UI线程里执行一些耗时任务,很容易就导致程序崩溃.并且目前网络任务也不能够在UI线程里执行.处理这些问题除了直接写一个线程以外,Android还提供一个AsyncTask(异步任务类)来更简单的处理一些耗时任务. AsyncTask<>是一个抽象类,通常用于继承,继承时需要指定三个泛型参数. 1.Params:启动任务时传入的参数的类型.这是一个数组,可以传多个参数.调用时使用params[0].params[1].par

Android AsyncTask 分析内部实现

转载自:http://blog.csdn.net/jjwwmlp456/article/details/38623563 sdk3.0前,使用内部的线程池,多线程并发执行.线程池大小等于5,最大达128 sdk3.0后,使用默认的serial线程池,执行完一个线程,再顺序执行下一个线程.sdk3.0<=current version <= sdk4.3时 线程池大小等于5,最大达128 sdk4.4后线程池大小等于 cpu count + 1,最大值为cpu count * 2 + 1 sdk

源码分析--AsyncTask

查看文档 AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers. AsyncTask使适当的和易用的用户界面线程.这个类允许执行后台操作,在UI线程上发布的结果

Android多线程分析之五:使用AsyncTask异步下载图像

Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<Android多线程分析之中的一个:使用Thread异步下载图像>中.曾演示了怎样使用 Thread 来完毕异步任务. Android 为了简化在 UI 线程中完毕异步任务(毕竟 UI 线程是 app 最重要的线程).实现了一个名为 AysncTask 的模板类.使用 AysncTask 能够在异步任务进行的同

Asynctask onPostExecute未执行的问题分析

问题现象:app使用Asynctask从网络下载数据,并将数据同步更新到UI上进行显示.在app使用的过程中,偶尔会出现数据未更新的情况,且这个问题现象一时找不到必现的操作方法跟踪问题原因发现是AsyncTask.onPostExecute未被执行到的原因. 问题解决办法:google之后,发现可以通过如下方法解决问题:在app的application中的onCreate方法中增加如下代码[mw_shl_code=java,true]try {                        Cl

Android中AsyncTask基本用法与源码分析(API 23)

原文链接 http://sparkyuan.github.io/2016/03/23/AsyncTask源码剖析(API 23)/ 转载请注明出处 Android的UI是线程不安全的,想在子线程中更新UI就必须使用Android的异步操作机制,直接在主线程中更新UI会导致程序崩溃. Android的异步操作主要有两种,AsyncTask和Handler.AsyncTask是一个轻量的异步类,简单.可控.本文主要结合API 23的源码讲解一下AsyncTask到底是什么. 基本用法 声明:Andr

分析AsyncTask中的线程池

问题由来: 之前看到一篇博文,说AsyncTask不适合运行多任务, 多个任务不会异步执行, 当时只是印象里记住了一下也不确定, 今天把代码看了看, 把原因写出来. 问题的代码演示: 1 public class AsyncTaskDemo extends AsyncTask<String, Integer, String>{ 2 private final static String TAG = "AsyncTaskTest"; 3 4 @Override 5 prote

源码分析Android AsyncTask

Android UI操作是线程不安全的,若想在子线程红进行UI操作,需要借助Android提供的Handler.Android提供的AsyncTask其实是对Handler的封装,方便我们在子线程中更新UI元素.AsyncTask是一个泛型类,书写格式为: AsyncTask<Params, Progress, Result>.这三个参数的用途如下: 1. Params 这三个参数的用途如下: 1. Params 在执行AsyncTask时需要传入的参数,可用于在后台任务中使用. 2. Pro