最近一直在学习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));
在这里实现到底成功了我们该怎么办。
基本就是这样了。