回调函数小记

最近一直在学习Android,也对整个处理过程加深了了解。其中最大的收获就是知道了如何使用回调函数来解决问题。

在我这个项目中,我需要异步的使用网络连接请求数据,请求完数据后呈现在界面上。

我们知道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是线程结束后执行的。

So,发起连接我们要在doInBackground里面执行,onPostExecute里面需要来调用回调函数,成功调用一个,失败调用一个。

贴下代码吧。

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));

在这里实现到底成功了我们该怎么办。

基本就是这样了。


转载于:https://my.oschina.net/u/994484/blog/369439

Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.java的Java类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值