1, 普通的http json请求 请看下面架构草图:
这样就抽象出了其他Activity可能需要的Http Json请求的功能. 只要其他Activity有Http Json请求的需求都可以继承BaseActivity. 这样就统一了该功能的请求模式, 而不必为每个Activity单独做这样的功能. 维护性也强.
2, API详解 :
①public void onPrepare()
在UI线程执行, 该方法主要是用来在任务执行前做的一些操作 : 如显示加载提示; 判断网络连接等.
②public Object shouldExecute(HttpParam params)
在子线程中执行 , 该方法主要是用来判断这个请求有没有必要执行下去. 应用场景: 判断该请求的数据是否在本地或者数据库中, 如果在则不需要请求网络, 执行从本地查询即可, 最后把数据返回出去, 这样也就减少了网络请求.
③public Object handleJsonData(String json) 在子线程中执行, 该方法主要用来处理返回的json数据. 然后把处理后的数据返回.
④public void onFinalResult(Object content) 在主线程中执行, 该方法主要用来, 把数据渲染到前台界面.
⑤public void onFailed(int type, String msg)
在主线程中执行, 该方法用来处理 请求失败的情况.
3 , 回调接口 :
我们需要把共性和特性区别开来, 把共性都统一处理了 . 而特性是可能个别子类Activity有不同的需求(比如有的Activity需要显示加载提示,有的不需要, ). 所以我们把这些功能抽象成接口, 共前台的Activity进行回调 . 如果没有特别的地方,则在前台Activity不重写(overriding)这些接口方法即可 . 这样就保证了功能灵活性.
这些回调方法我统一抽取到了一个接口里:
public interface ISingleCallback { public void onError(int taskFlag,int type, String msg); public Object searchCache(int taskFlag,HttpParam params); public Object parseJson(int taskFlag,String json); public void onFinalData(int taskFlag,Object result); }
把这些接口方法分别放到②API详解即可.
4 , BaseActivity中完整的http json方法代码如下
<strong><span style="color:#ff0000;">protected void sendRequest(final int taskFlag, HttpParam params, final boolean isNeedDialog) {</span></strong> if (TaskController.getInstance().exist(taskFlag)) { ToastUtil.showShortToast(getApplicationContext(), R.string.task_executing); return; } new TaskHttp(taskFlag, new HttpCallback() { @Override public void onPrepare() { if (isNeedDialog) { if (loadingDialog == null) { loadingDialog = new LoadingDialog(BaseActivity.this); } showLoadTip(); } } @Override public Object shouldExecute(HttpParam params) { return searchCache(taskFlag, params); } @Override public Object handleJsonData(String json) { try { return parseJson(taskFlag, json); } catch (Exception e) { e.printStackTrace(); } return null; } @Override public void onFinalResult(Object content) { onFinalData(taskFlag, content); } @Override public void onFailed(int type, String msg) { onError(taskFlag, type, msg); } }).execute(params); }
5, 其他请求:
以上的介绍都是请求http, 但是我们还可能有其他请求, 比如单个数据库查询请求. 这时候我们使用上面一套功能就可能不太合适了. 其实有了上面的思想, 这个很好实现, 第一, 内置一个匿名内部类(AsyncTask), 第二, 通过回调(Interface)把数据传回给前台Activity(Front Activity)进行处理. 代码如下:
protected void sendBackgroudTask(final int taskFlag, final Object params) { new AsyncTask<Void, Void, Object>() { @Override protected Object doInBackground(Void... arg0) { return backgroudTask(taskFlag, params); } protected void onPostExecute(Object result) { onDataBack(taskFlag, result); } }.execute(); }