您的位置:首页 > 其它

项目----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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存泄露