项目----1(在项目开发中AsyncTask与Activity生命周期不一导致内存泄露的问题)
2016-02-23 16:15
441 查看
用途:项目开发中用于请求数据
package com.bjtxwy.efun.base;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import com.alibaba.fastjson.JSON;
import com.bjtxwy.efun.activity.login.LoginActivity;
import com.bjtxwy.efun.bean.JsonResult;
import com.bjtxwy.efun.config.GlobalVariables;
import com.bjtxwy.efun.utils.HttpUtils;
import com.bjtxwy.efun.utils.StringUtils;
import java.lang.ref.WeakReference;
import java.util.Map;
/**
* 重构AsyncTask抽象类,实现弱引用。解决AsyncTask和Activity生命周期不一导致内存泄露的问题
* <p/>
* Created by Charming on 15/12/16.
* WeakTarget:activity对象
*/
public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends
AsyncTask<Params, Progress, Result> {
protected WeakReference<WeakTarget> mTarget;
//使用弱引用
public WeakAsyncTask(WeakTarget target) {
mTarget = new WeakReference<WeakTarget>(target);
}
/**
* {@inheritDoc}
*/
@Override
protected final void onPreExecute() {
//当对象不为空的时候调用方法
final WeakTarget target = mTarget.get();
if (target != null) {
this.onPreExecute(target);
}
}
/**
* {@inheritDoc}
*/
@Override
protected final Result doInBackground(Params... params) {
//当对象不为空的时候调用方法
final WeakTarget target = mTarget.get();
if (target != null) {
return this.doInBackground(target, params);
} else {
return null;
}
}
/**
* {@inheritDoc}
*/
@Override
protected final void onPostExecute(Result result) {
//当对象不为空的时候调用方法
final WeakTarget target = mTarget.get();
if (target != null) {
this.onPostExecute(target, result);
if (result instanceof String && target instanceof Activity) {
//当返回结果为空
if (StringUtils.isEmpty((String) result)) {
return;
}
try {
JsonResult jsonResult = JSON.parseObject((String) result, JsonResult.class);
if (JsonResult.TOKEN_ILLEGAL.equals(jsonResult.getStatus()) || JsonResult.TOKEN_TIMEOUT.equals(jsonResult.getStatus())) {
/**
* tonken失效或其他问题不能使用的时候跳转到登录页面
*/
((Activity) target).startActivityForResult(new Intent((Activity) target, LoginActivity.class), REQUEST_CODE_TOKEN_FAIL_GO_LOGIN);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
protected void onPreExecute(WeakTarget target) {
// No default action
}
protected abstract Result doInBackground(WeakTarget target, Params... params);
protected void onPostExecute(WeakTarget target, Result result) {
// No default action
}
public static final int REQUEST_CODE_TOKEN_FAIL_GO_LOGIN = 405;
}
package com.bjtxwy.efun.base;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import com.alibaba.fastjson.JSON;
import com.bjtxwy.efun.activity.login.LoginActivity;
import com.bjtxwy.efun.bean.JsonResult;
import com.bjtxwy.efun.config.GlobalVariables;
import com.bjtxwy.efun.utils.HttpUtils;
import com.bjtxwy.efun.utils.StringUtils;
import java.lang.ref.WeakReference;
import java.util.Map;
/**
* 重构AsyncTask抽象类,实现弱引用。解决AsyncTask和Activity生命周期不一导致内存泄露的问题
* <p/>
* Created by Charming on 15/12/16.
* WeakTarget:activity对象
*/
public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends
AsyncTask<Params, Progress, Result> {
protected WeakReference<WeakTarget> mTarget;
//使用弱引用
public WeakAsyncTask(WeakTarget target) {
mTarget = new WeakReference<WeakTarget>(target);
}
/**
* {@inheritDoc}
*/
@Override
protected final void onPreExecute() {
//当对象不为空的时候调用方法
final WeakTarget target = mTarget.get();
if (target != null) {
this.onPreExecute(target);
}
}
/**
* {@inheritDoc}
*/
@Override
protected final Result doInBackground(Params... params) {
//当对象不为空的时候调用方法
final WeakTarget target = mTarget.get();
if (target != null) {
return this.doInBackground(target, params);
} else {
return null;
}
}
/**
* {@inheritDoc}
*/
@Override
protected final void onPostExecute(Result result) {
//当对象不为空的时候调用方法
final WeakTarget target = mTarget.get();
if (target != null) {
this.onPostExecute(target, result);
if (result instanceof String && target instanceof Activity) {
//当返回结果为空
if (StringUtils.isEmpty((String) result)) {
return;
}
try {
JsonResult jsonResult = JSON.parseObject((String) result, JsonResult.class);
if (JsonResult.TOKEN_ILLEGAL.equals(jsonResult.getStatus()) || JsonResult.TOKEN_TIMEOUT.equals(jsonResult.getStatus())) {
/**
* tonken失效或其他问题不能使用的时候跳转到登录页面
*/
((Activity) target).startActivityForResult(new Intent((Activity) target, LoginActivity.class), REQUEST_CODE_TOKEN_FAIL_GO_LOGIN);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
protected void onPreExecute(WeakTarget target) {
// No default action
}
protected abstract Result doInBackground(WeakTarget target, Params... params);
protected void onPostExecute(WeakTarget target, Result result) {
// No default action
}
public static final int REQUEST_CODE_TOKEN_FAIL_GO_LOGIN = 405;
}
相关文章推荐
- c语言内存泄露示例解析
- 解决js函数闭包内存泄露问题的办法
- IE下使用jQuery重置iframe地址时内存泄露问题解决办法
- Android App调试内存泄露之Cursor篇
- js内存泄露的几种情况详细探讨
- Javascript 闭包引起的IE内存泄露分析
- 深入解析PHP垃圾回收机制对内存泄露的处理
- PHP脚本内存泄露导致Apache频繁宕机解决方法
- 容易造成JavaScript内存泄露几个方面
- 关于js内存泄露的一个好例子
- 总结JavaScript在IE9之前版本中内存泄露问题
- Android垃圾回收机制解决内存泄露问题
- Android编程中避免内存泄露的方法总结
- C语言中的内存泄露 怎样避免与检测
- PHP CURL 内存泄露问题解决方法
- Java中典型的内存泄露问题和解决方法
- Android中Handler引起的内存泄露问题解决办法
- 浅谈Java编程中的内存泄露情况
- 理解Java中的内存泄露及解决方法示例
- Android中声名Handler变量的内存泄露问题