封装AsyncTask异步请求网络

来源:互联网 发布:java 内存泄露场景 编辑:程序博客网 时间:2024/05/18 14:25

封装AsyncTask异步请求网络

  • 封装AsyncTask异步请求网络
    • 如何封装
      • 思考
      • CallServer 请求到队列封装

当我们用AsyncTask请求网络时,每一个接口我们都要重新写一个AsyncTask类,这是在重复造轮子,我们要禁止重复造轮子。

如何封装

当我们写代码有重复的代码时,我们如何封装?

  1. 重复的变量,需要封装
  2. 重复的方法,需要封装
  3. 重复的属性,需要封装

下面我们来看如何封装AsyncTask

思考

既然我们封装的是异步网络请求,肯定要有success()和failure()两个方法,那么如何用这两个方法? 自然要在网络请求成功和失败的时候调用,并且要把返回的数据传给这两个方法,所以这两个方法改成success(<T>)和failure(<T>) <T>泛型或者改成你想要的数据类型,可以接收任何数据。然后我们在得到这两个方法就可以得到返回的数据,那么如何实现这两个方法,自然是interface接口来实现。

看下面这段代码
SimpleTaskListener

//也可以把参数改成<T>public interface SimpleTaskListener {    /**     * 成功       */    void success(JSONObject data);    /**     * 失败     */    void failure(String errorCode,String message);}

上面这段代码就是监听,请求成功或者失败

接下来是我们的重点,来封装AsyncTask
HttpResponseTask
这段代码不难,大家看注释就能看懂。

import android.content.Context;import android.os.AsyncTask;import com.baichi.common.listener.SimpleTaskListener;import com.baichi.common.network.core.Caller;import com.baichi.common.network.model.NetworkBean;import com.baichi.common.utils.StringUtils;import com.professorfan.view.dialog.LoadingProgressDialog;import java.util.Map;/** *  异步请求网络AsyncTask封装,不用每个接口都要创建AsyncTask类,禁止重复造轮子 */public class HttpResponseTask extends AsyncTask<Void, Integer, NetworkBean> {    /**     * 简单任务监听器     */    private SimpleTaskListener simpleTaskListener;//监听器    private Context context;//上下文    private LoadingProgressDialog loadingProgressDialog;//加载框    private boolean isLoading;//是否需要弹出加载框    private String url;//请求的url    private Map<String, Object> mapParams;//请求的参数    private Caller mCaller;//网络请求类的封装    public HttpResponseTask(String url, Map<String, Object> mapParams, Context context, boolean isLoading,SimpleTaskListener simpleTaskListener) {        this.simpleTaskListener = simpleTaskListener;        this.url = url;        this.context = context;        this.isLoading = isLoading;        this.mapParams = mapParams;        mCaller = new Caller();        if (context != null) {            loadingProgressDialog = LoadingProgressDialog.createDialog(context);        }    }    @Override    protected void onPreExecute() {        super.onPreExecute();        if (isLoading && loadingProgressDialog != null && !loadingProgressDialog.isShowing())            loadingProgressDialog.show();    }    @Override    protected NetworkBean doInBackground(Void... voids) {        String result = mCaller.httpPost(mapParams, url);        return new NetworkBean(result);//这句是对返回值的封装,自行脑补吧    }    @Override    protected void onProgressUpdate(Integer... values) {        super.onProgressUpdate(values);    }    @Override    protected void onPostExecute(NetworkBean result) {        if (simpleTaskListener != null) {            if (result != null && StringUtils.isNotBlank(result.getCode()) && result.getCode().equals("10020")                    && result.getData() != null) {                simpleTaskListener.success(result.getData());            } else {                simpleTaskListener.failure(result.getCode(), result.getMessage());            }        }        if (isLoading && loadingProgressDialog != null && loadingProgressDialog.isShowing())            loadingProgressDialog.cancel();    }}

我们继续封装

CallServer 请求到队列封装

import android.content.Context;import android.os.AsyncTask;import com.baichi.common.listener.SimpleTaskListener;import java.util.Map;/** * Created by sufulu on 2016/8/18 0018. * 请求到队列封装,禁止重复造轮子 */public class CallServer {    private static CallServer callServer;    private HttpResponseTask mResponseTask;    //确保只创建一个实例    public CallServer() {    }    //synchronized 锁住优化单例模式    public synchronized static CallServer getInstance() {        if (callServer == null) {            callServer = new CallServer();        }        return callServer;    }    //执行异步网络请求    public void execute(String url, Map<String, Object> mapParams,Context context, boolean isLoading ,SimpleTaskListener simpleTaskListener) {        mResponseTask = new HttpResponseTask(url,mapParams, context, isLoading ,simpleTaskListener);        mResponseTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);    }}

OK 这样我们就封装完毕,如何使用呢,很简单几句代码
一目了然有木有。

 Map<String, Object> mapParams = new HashMap<String, Object>();//参数        mapParams.put("page", page);        mapParams.put("city_id", city_id);        CallServer.getInstance().execute(ApiUrlConfig.DUOBAOHOMELIST,//url mapParams, context, true, new SimpleTaskListener() {            @Override            public void success(JSONObject data) {              //解析json 数据            }            @Override            public void failure(String errorCode, String message) {                //谢你想要的操作            }        });
2 0