最近一直在學習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