回调函数小记

最近一直在学习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

相关文章
相关标签/搜索