• AsyncTask中各个函数详细的调用过程,初步实现异步任务


     AsyncTask内部类可能会产生内存泄露的问题

    解决上述内部类可能引起的内存泄露问题的方法

    • 将AsyncTask或者Thread的子类作为单独的类文件,不持有Activity的强引用
    • 将AsyncTask或者Thread的子类使用static修饰,则不会隐式持有Activity的强引用
    • 如果是匿名内部类,则需要将其对象设置成成员属性,使用static修饰就不会隐式持有Activity的强引用。

    异步任务是我们经常要使用的东西,android中提供了一套解决方案,从异步任务的开始到结束,相当完善。本实例没有任何应用价值,只是说明了AsyncTask中各个函数的调用顺序。

    具体的结果看下面的Log输出即可:

    异步任务类:

    AsyncTaskTest.java

    package com.kale.asynctask;
    
    import java.net.URL;
    
    import android.R.integer;
    import android.os.AsyncTask;
    
    /**
     * @author:Jack Tony
     * @tips  :
     * 必须在UI线程中创建AsyncTask实例
     * 必须在UI线程中执行AsyncTask的execute方法
     * 每个AsyncTask只能执行一次,不能多次调用。要用的话再生成一个对象再执行即可
     * @date  :2014-8-1
     */
    /**
     * @param 
     * execute传来的参数是第三个参数
     * 第一个参数的类型提供给publishProgress做参数(可变长的数组)
     * 第二个参数定义的是onProgressUpdate的参数类型(可变长的数组)
     * 第三个参数作为doInBackground返回值的类型,返回给onPostExecute做形参
     */
    public class AsyncTaskTest extends AsyncTask<URL, Integer, String>{
    
        /* (非 Javadoc)
         * @see android.os.AsyncTask#onPreExecute()
         * 开始异步任务前会调用此方法,这个方法执行在UI线程中
         */
        @Override
        protected void onPreExecute() {
            System.out.println("onPreExecute 开始执行");
            System.out.println("onPreExecute 执行初始化操作,执行UI操作");
            System.out.println("onPreExecute 所在的线程:"+Thread.currentThread().getName());
            System.out.println("onPreExecute 执行完毕,开始执行doInBackground");
        }
        /* 
         * @see android.os.AsyncTask#doInBackground(Params[]),里面就是个可变长度的数组
         * 里面写后台线程要完成任务,里面可以调用publishProgress(values);更新进度
         * 可以有变长的参数,对个数无要求
         */
        @Override
        protected String doInBackground(URL... params) {
            System.out.println("doInBackground 开始执行");
            System.out.println("doInBackground 执行耗时的异步任务");
            System.out.println("doInBackground 所在的线程:"+Thread.currentThread().getName());
            System.out.println("doInBackground 执行耗时的异步任务");
            System.out.println("doInBackground 中调用publishProgress更新下视图");
            for (int i = 0; i < 3; i++) {
                publishProgress(i);//这里传的值是给onProgressUpdate做参数的,这里传的也是一个可变长的数组
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
            System.out.println("doInBackground 执行完毕,准备执行onPostExecute");
            return "doInBackground执行完后的结果";
        }
        
        /* (非 Javadoc)
         * @see android.os.AsyncTask#onProgressUpdate(Progress[])
         * 在doInBackground中调用publishProgress时会执行这个方法,主要用来更新进度
         * 执行在UI线程中
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            System.out.println("onProgressUpdate 开始执行,更新UI视图,一般是进度");
            System.out.println("onProgressUpdate 执行第【"+(values[0].intValue()+1)+"】次更新操作");
            System.out.println("onProgressUpdate 所在的线程:"+Thread.currentThread().getName());
            System.out.println("onProgressUpdate 执行完毕,更新操作结束");
        }
    
        /* (非 Javadoc)
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         * 在doInBackground执行完后,系统将doInBackground方法返回的参数作为形参传递到这个方法中
         * 它执行在UI线程中
         */
        @Override
        protected void onPostExecute(String result) {
            System.out.println("onPostExecute 开始执行,更新UI视图");
            System.out.println("onPostExecute 接收到的处理结果是:【"+result+"】");
            System.out.println("onPostExecute 执行收尾操作");
            System.out.println("onPostExecute 所在的线程:"+Thread.currentThread().getName());
            System.out.println("onPostExecute 执行完毕,异步任务完全结束");
        }
    }

    MainActivity.java

    package com.kale.asynctask;
    
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            AsyncTaskTest async = new AsyncTaskTest();
            URL url = null;
            try {
                url = new URL("http://www.baidu.com");
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            async.execute(url,url);//这里传进去的数据是给doInBackground做参数用的,可以传任意个参数
        }
    }
  • 相关阅读:
    cookie小结
    WEB服务器,TOMCAT和servlet之间的关系
    HTTP协议基础总结
    servlet总结
    注解总结
    常使用的String方法
    变量&&常量
    标识符&&注释&&关键字
    配置环境变量&&OpenJDK和OracleJDK区别
    逆向工程__Generate插件安装 && xml配置文件解析 &&使用反向生成代码 && 接口说明
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/3884695.html
Copyright © 2020-2023  润新知