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做参数用的,可以传任意个参数
}
}

AsyncTask中各个函数详细的调用过程,初步实现异步任务的更多相关文章

  1. php中session_id()函数详细介绍,会话id生成过程及session id长度

    php中session_id()函数原型及说明session_id()函数说明:stringsession_id([string$id])session_id() 可以用来获取/设置 当前会话 ID. ...

  2. Presto 标量函数注册和调用过程简述

    在Presto 函数开发一文中已经介绍过如何进行函数开发,本文主要讲述标量函数(Scalar Function)实现之后,是如何在Presto内部进行注册和被调用的.主要讲述标量函数是因为:三类函数的 ...

  3. 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)

    本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同,比 ...

  4. linux中 probe函数的何时调用的?

    点击打开链接 linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名字匹配,BUS就会调用驱动的probe函数,但是有时我们要看看probe函数里面到底做了什么,还有传递给p ...

  5. C++和C中的函数如何相互调用

    今天笔试遇到的一题,当时就写了在函数前声明为C,按C编译. 首先是在C中调用C++函数,包括普通函数,重载函数以及成员函数. 对于普通函数,在C++中声明为extern "C",在 ...

  6. MySQL中字符串函数详细介绍

    MySQL字符串函数对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str)返回字符串str的 最左面字符的ASCII代码值.如果str是空字符串, 返回0.如果str是NULL,返回N ...

  7. armv8(aarch64)linux内核中flush_dcache_all函数详细分析【转】

    转自:http://blog.csdn.net/qianlong4526888/article/details/12062809 版权声明:本文为博主原创文章,未经博主允许不得转载. /* *  __ ...

  8. armv8(aarch64)linux内核中flush_dcache_all函数详细分析

    /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...

  9. GDB踪函数的完整调用过程 及原理

    http://www.lenky.info/archives/2013/02/2202 Breakpoint , .so. (gdb) bt # .so. # .so. # .so. # .so. # ...

随机推荐

  1. .NetCore中使用ExceptionLess 添加操作日志

    上一篇文章已经扩展了日志,下面我们在结合下处理操作日志 通常我们想到操作日志 可能想到的参数可能有 模块 方法 参数内容 操作人 操作时间 操作 Ip 下面我们就来结合这些信息添加操作日志 如果要在代 ...

  2. 《深入分析JavaWeb技术内幕》学习笔记

    第一章 深入Web请求过程 1.1 B/S网站架构概述 HTTP协议采用无状态的短连接的通信方式.通常一次请求就完成一次数据交互,通常也对应一个业务逻辑. 当在浏览器里输入一个URL,首先会请求DNS ...

  3. Android Studio 入门级教程(三):gradle项目构建

    声明 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4456420.html [系列] Andr ...

  4. doc文档生成带目录的pdf文件方法

    准备软件: 福昕PDF阅读器 下载地址:http://rj.baidu.com/soft/detail/12882.html?ald 安装福昕PDF阅读器,会自动安装pdf打印机. 准备好设置好各级标 ...

  5. 【LOJ】#2076. 「JSOI2016」炸弹攻击

    题解 我冷静一下,话说如果去掉建筑和R的限制好像是模拟退火吧 然后开始写模拟退火了,起始点就随机一个敌人作为起始点 没对着数据写了一下获得了70pts,感到美滋滋 然后对着数据卡了很久--发现有个数据 ...

  6. Python - 计算个人所得税

    最近在学python,写了个计算个人所得税计算的脚本,分享. 以下为python3适用版本 #!/usr/bin/python # -*- coding: UTF-8 -*- # 该python脚本用 ...

  7. 【bfs】BZOJ1102- [POI2007]山峰和山谷Grz

    最后刷个水,睡觉去.Bless All! [题目大意] 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是 ...

  8. [Java]进程与线程的区别(转)

    线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; (2)资源拥有: ...

  9. 喵哈哈村的魔法考试 Round #5 (Div.2) 题解

    老规矩 有问题直接联系我:475517977@qq.com A 直接暴力的for一遍,统计连续的有多少个就好了.模拟题. #include<bits/stdc++.h> using nam ...

  10. Canbus ID filter and mask

    Canbus ID filter and mask CANBUS is a two-wire, half-duplex, bus based LAN system that is ‘collision ...