封装AsyncTask异步请求网络
来源:互联网 发布:java 内存泄露场景 编辑:程序博客网 时间:2024/05/18 14:25
封装AsyncTask异步请求网络
- 封装AsyncTask异步请求网络
- 如何封装
- 思考
- CallServer 请求到队列封装
- 如何封装
当我们用AsyncTask请求网络时,每一个接口我们都要重新写一个AsyncTask类,这是在重复造轮子,我们要禁止重复造轮子。
如何封装
当我们写代码有重复的代码时,我们如何封装?
- 重复的变量,需要封装
- 重复的方法,需要封装
- 重复的属性,需要封装
下面我们来看如何封装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
- 封装AsyncTask异步请求网络
- Android使用AsyncTask异步请求网络
- 异步请求AsyncTask
- listview+BaseAdapter + AsyncTask异步请求网络 + LruCache缓存图片
- URLConnection的post请求网络数据和AsyncTask异步线程
- 【Android实战之旅 001】AsyncTask异步操作网络请求
- android 网络数据请求步骤 一 异步操作 AsyncTask
- asyncTask 异步网络请求数据 判断适配器为空
- Android异步线程AsyncTask封装
- AsyncTask请求网络
- AsyncTask网络请求数据
- iOS开发——post异步网络请求封装
- iOS开发——POST异步网络请求自行封装
- 同步异步网络请求封装以及数据JSON解析
- ios自定义异步post网络请求的封装
- iOS开发——post异步网络请求封装
- java回调与异步网络请求的封装
- Android之封装好的异步网络请求框架
- Mongoose使用操作
- 呼叫中心前期准备
- swift 元组的使用
- ViewPager+PagerTabStrip
- 多少IT人愿意花钱买经验?
- 封装AsyncTask异步请求网络
- ICE之——IceGrid负载均衡部署
- python3.6 xlwt 安装报错解决
- 在py-faster-rcnn/lib下make报错 EnvironmentError: The CUDA lib64 path could not be located in /usr/lib64
- 写给那些用PLSQL和SQLDEV报错的小朋友们
- InnoDB和MyIsAM的区别
- Paxos算法与Zookeeper分析
- scrpay 和 pyv8解析js,抓取天气预报数据
- RESTful API 设计最佳实践