学习总结自极客学院Android教学视频:实践项目《秘密》。原教程使用UrlConnect进行连接,我改进成HttpClient,并整合加入了进度条,避免每一次使用框架都要重新写一个进度条。
对代码不理解的朋友,强烈建议学习一下极客学院的教程,关于AsyncTask、httpClient以及对Json对象的解析可以参考我的另一篇博文。
作者接触安卓开发不到三个月,问题还有很多,希望大家能够多交流。
源代码如下。
public class NetConnection {
public NetConnection(final String url,
final SuccessCallback successCallback,
final FailCallback failCallback,final Context context,final String... kvs) {
final ProgressDialog dialog = new ProgressDialog(context);
dialog.setCancelable(false);
dialog.setTitle(R.string.title_connecting);
dialog.setMessage(context.getString(R.string.message_connecting));
dialog.show();
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... arg0) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (int i = 0; i < kvs.length; i += 2) {
params.add(new BasicNameValuePair(kvs[i], kvs[i + 1]));
}
HttpClient httpClient;
httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
StringBuffer result = new StringBuffer();
try {
httpPost.setEntity(new UrlEncodedFormEntity(params,
HTTP.UTF_8));
HttpResponse httpResponse = httpClient.execute(httpPost);
System.out.println(">>>>---提交信息--->>>>");
System.out.println("Request data:"
+ params.toString());
System.out.println(">>>>------>>>>");
if (httpResponse.getStatusLine().getStatusCode() == 200) {
InputStream is = httpResponse.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is,
HTTP.UTF_8);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
result.append(line);
}
br.close();
isr.close();
is.close();
System.out.println(">>>>---获取信息--->>>>");
System.out.println(result.toString());
System.out.println(">>>>------>>>>");
return result.toString();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String result) {
if (result != null) {
if (successCallback != null) {
successCallback.onSuccess(result);
}
} else {
if (failCallback != null) {
failCallback.onFail();
}
}
dialog.dismiss();
super.onPostExecute(result);
};
}.execute();
}
public static interface SuccessCallback {
void onSuccess(String result);
}
public static interface FailCallback {
void onFail();
}
}
其中使用了ProgressDialog,所以构造方法中要传入Context参数,有关UI的操作,android中要求在非主线程中进行,所以使用AsyncTask。
在doInBackgroud方法中,使用HttpClient获取网络内容,返回值为String类型,传入onPostExcute方法中,使用回调接口onSuccess.
其余只要在其构造方法,传入参数和连接地址即可。