项目----1(在项目开发中AsyncTask与Activity生命周期不一导致内存泄露的问题)

来源:互联网 发布:unity3d 动态生成模型 编辑:程序博客网 时间:2024/05/15 10:18

用途:项目开发中用于请求数据

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;




}

0 0
原创粉丝点击