回調函數小記

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

相關文章
相關標籤/搜索