封装AsyncTask异步请求网络

封装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) {
                //谢你想要的操作
            }
        });

你可能感兴趣的:(网络,异步,AsyncTask,封装)