最近一直在学习Android,也对整个处理过程加深了了解。其中最大的收获就是知道了如何使用回调函数来解决问题。
java
在我这个项目中,我须要异步的使用网络链接请求数据,请求完数据后呈如今界面上。安全
咱们知道Android的主线程是不安全的,因此咱们不能在子线程中操做主线程。因而乎,有个好用的东西就来了网络
new AsyncTask<String, Integer, Double>() { @Override protected Double doInBackground(String... arg0) { // TODO Auto-generated method stub return null; } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); } @Override protected void onPostExecute(Double result) { // TODO Auto-generated method stub super.onPostExecute(result); } }.execute("");
这个东西里面,doInBackground里面的内容是后台执行的,onPreExecute是线程启动前执行的,onPostExecute是线程结束后执行的。app
So,发起链接咱们要在doInBackground里面执行,onPostExecute里面须要来调用回调函数,成功调用一个,失败调用一个。异步
贴下代码吧。ide
public class NetConnection { /** * @author 小宇 * @param url 调用地址 * @param method GET仍是POST * @param resultcallback 回调函数啦 * @param kvs POST参数对 */ public NetConnection(final String url, final HttpMethod method, final ResultCallback resultcallback, final String... kvs) { System.out.println("网络链接任务已构造"); new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... ps) { StringBuffer content = new StringBuffer(); for (int i = 0; i < kvs.length; i += 2) { content.append(kvs[i]).append("=").append(kvs[i + 1]) .append("&"); } try { URLConnection uc; switch (method) { case POST: uc = new URL(url).openConnection(); uc.setDoInput(true); uc.setDoOutput(true); OutputStream os = uc.getOutputStream(); os.write(content.toString().getBytes(Config.CHARSET)); os.flush(); break; default: uc = new URL(url + "?" + content.toString()) .openConnection(); uc.setDoInput(true); uc.setDoOutput(false); break; } System.out.println("request url-->" + uc.getURL()); System.out.println("request content-->" + content); InputStream is = uc.getInputStream(); StringBuffer result = new StringBuffer(); BufferedReader br = new BufferedReader( new InputStreamReader(is, Config.CHARSET)); String line = null; while ((line = br.readLine()) != null) { result.append(line); } System.out.println("request result=" + result); return result.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { if (resultcallback != null) { if (result != null) { resultcallback.onSuccess(result); } else { resultcallback.onFail(); } } super.onPostExecute(result); } }.execute(); } public static interface ResultCallback { void onSuccess(String result); void onFail(); } }
在这个类里面咱们声明了一个接口,接口有两个方法,onSuccess和onFail,而他们具体干了什么呢,我不知道,也不须要知道,留给主线程去实现吧~函数
主线程实现以下:学习
new NetConnection(Config.SERVER_URL + "login", HttpMethod.POST, new ResultCallback() { @Override public void onSuccess(String result) { try { JSONObject jsobj = new JSONObject(result); switch (jsobj.getInt(Config.KEY_STATUS)) { case Config.RESULT_STATUS_SUCCESS: if (resultCallback != null) resultCallback.onSuccess(jsobj .getString("token")); break; default: break; } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onFail() { // TODO Auto-generated method stub } }, Config.KEY_ACCTION, Config.ACTION_LOGIN, Config.KEY_PHONE_NUM, phone, Config.KEY_PASSWD, MD5Tool.md5(passwd));
在这里实现到底成功了咱们该怎么办。url
基本就是这样了。spa