5.AsyncHttp、post

httpClient

	// 网络访问请求
 new Thread(new Runnable() {
 @Override
 public void run() {
 String url = "http://192.168.1.101:8080/ChatServer/register";
 // 创建 httpClient
 HttpClient client = new DefaultHttpClient();
 // 创建 post请求
 HttpPost post = new HttpPost(url);
 List<NameValuePair> pairs = new ArrayList<NameValuePair>();
 // 配置请求头
 // post.addHeader("", "");
 // 配置请求参数
				pairs.add(new BasicNameValuePair("account", account));
				pairs.add(new BasicNameValuePair("password", password));
 try {
					post.setEntity(new UrlEncodedFormEntity(pairs));
 HttpResponse response = client.execute(post);
 int statusCode = response.getStatusLine().getStatusCode();
 if (statusCode == 200) {
 // 拿到网络的返回结果
 final String result = EntityUtils.toString(response
 .OgetEntity());
 Log.d("result : ", "" + result);
 // 需要在主线线程中做UI操作
						getActivity().runOnUiThread(new Runnable() {
 @Override
 public void run() {
								doResult(result);
 }
 });
 }
 } catch (Exception e) {
					e.printStackTrace();
 }
 }
 }).start();

AsyncHttp

// 创建 访问端
 AsyncHttpClient client = new AsyncHttpClient();
 // 接口地址
 String url = "http://192.168.1.101:8080/ChatServer/register";
 //
 RequestParams params = new RequestParams();
		params.put("account", account);
		params.put("password", password);
 // 调用post方法访问网络
		client.post(context, url, params, new TextHttpResponseHandler() {
 @Override
 public void onSuccess(int statusCode, Header[] headers,
 String responseString) {
 Log.d("success", responseString + "");
 JsonParser parser = new JsonParser();
 JsonElement element = parser.parse(responseString);
 JsonObject root = element.getAsJsonObject();
 JsonPrimitive flagJson = root.getAsJsonPrimitive("flag");
 boolean flag = flagJson.getAsBoolean();
 if (flag) {
 JsonObject dataObject = root.getAsJsonObject("data");
 if (dataObject != null) {
 Account user = new Gson().fromJson(dataObject,
 Account.class);
 Log.d("", user.toString());
 }
 } else {
 JsonPrimitive errorCodeJson = root
 .getAsJsonPrimitive("errorCode");
 JsonPrimitive errorStringJson = root
 .getAsJsonPrimitive("errorString");
 Log.d("", errorCodeJson.getAsInt() + " : "
 + errorStringJson.getAsString());
 }
 }
 @Override
 public void onFailure(int statusCode, Header[] headers,
 String responseString, Throwable throwable) {
 Log.d("error", responseString + " : " + throwable.getMessage());
 }
 });

由于不需要每个页面访问网络都去写这一段代码,抽取:

回调接口:

public abstract class ObjectCallback<T> {
 private final Class<T> clazz;
 @SuppressWarnings("unchecked")
 public ObjectCallback() {
 ParameterizedType type = (ParameterizedType) this.getClass()
 .getGenericSuperclass();
		clazz = (Class<T>) type.getActualTypeArguments()[0];//获取泛型
 }
 public Class<T> getDataClass() {
 return clazz;
 }
 public abstract void onSuccess(T data);
 public abstract void onFailure(int errorCode, String errorString);
}

HMChatManager

public class HMChatManager {
 private static HMChatManager instance;
 private Context context;
 public static HMChatManager getInstance(Context context) {
 if (instance == null) {
 synchronized (HMChatManager.class) {
 if (instance == null) {
					instance = new HMChatManager(context);
 }
 }
 }
 return instance;
 }
 private HMChatManager(Context context) {
 this.context = context;
 }
 @SuppressWarnings("rawtypes")
 public HttpFuture sendRequest(String url, final ObjectCallback callback) {
 return sendRequest(url, null, callback);
 }
 @SuppressWarnings("rawtypes")
 public HttpFuture sendRequest(String url, Map<String, String> headers,
 Map<String, String> paramters, final ObjectCallback callback) {
 // 创建 访问端
 AsyncHttpClient client = new AsyncHttpClient();
 // 请求消息头
 if (headers != null) {
 for (Map.Entry<String, String> me : headers.entrySet()) {
				client.addHeader(me.getKey(), me.getValue());
 }
 }
 // 请求参数
 RequestParams params = new RequestParams();
 // params.put("account", account);
 // params.put("password", password);
 if (paramters != null) {
 for (Map.Entry<String, String> me : paramters.entrySet()) {
				params.put(me.getKey(), me.getValue());
 }
 }
 // 调用post方法访问网络
 RequestHandle handle = client.post(context, url, params,
 new TextHttpResponseHandler() {
 @SuppressWarnings("unchecked")
 @Override
 public void onSuccess(int statusCode, Header[] headers,
 String responseString) {
 Log.d("success", responseString + "");
 JsonParser parser = new JsonParser();
 JsonElement element = parser.parse(responseString);
 JsonObject root = element.getAsJsonObject();
 JsonPrimitive flagJson = root
 .getAsJsonPrimitive("flag");
 boolean flag = flagJson.getAsBoolean();
 if (flag) {
 JsonObject dataObject = root
 .getAsJsonObject("data");
 if (dataObject != null) {
 if (callback != null) {
 @SuppressWarnings("unchecked")
 Object obj = new Gson().fromJson(
											dataObject, callback.getDataClass());
									callback.onSuccess(obj);
 }
 }
 } else {
 JsonPrimitive errorCodeJson = root
 .getAsJsonPrimitive("errorCode");
 JsonPrimitive errorStringJson = root
 .getAsJsonPrimitive("errorString");
 Log.d("", errorCodeJson.getAsInt() + " : "
 + errorStringJson.getAsString());
 if (callback != null) {
								callback.onFailure(errorCodeJson.getAsInt(),
										errorStringJson.getAsString());
 }
 }
 }
 @Override
 public void onFailure(int statusCode, Header[] headers,
 String responseString, Throwable throwable) {
 Log.d("error",
								responseString + " : " + throwable.getMessage());
 if (callback != null) {
							callback.onFailure(HMError.ERROR_SERVER, "服务器连接问题");
 }
 }
 });
 return new HttpFuture(handle);
 }

访问的的时候

String url = "http://192.168.1.101:8080/ChatServer/register";
		Map<String, String> paramters = new HashMap<String, String>();
		paramters.put("account", account);
		paramters.put("password", password);
		future = HMChatManager.getInstance(getActivity()).sendRequest(url,
				paramters, new ObjectCallback<Account>() {
					@Override
					public void onSuccess(Account data) {
						Log.d("onSuccess", data.toString());
						// 数据的存储
						AccountDao dao = new AccountDao(getActivity());
						data.setCurrent(true);
						Account localAccount = dao.getByAccount(data
								.getAccount());
						if (localAccount != null) {
							dao.updateAccount(data);
						} else {
							dao.addAccount(data);
						}
						// 页面跳转
						((LoginActivity) getActivity()).go2FillInfo();
					}
					@Override
					public void onFailure(int errorCode, String errorString) {
						Log.d("onFailure", errorCode + " : " + errorString);
						switch (errorCode) {
						case HMError.ERROR_CLIENT_NET:
							Log.d(TAG, "客户端网络异常");
							ToastUtil.show(getActivity(), "客户端网络异常");
							break;
						case HMError.ERROR_SERVER:
							Log.d(TAG, "服务器异常");
							ToastUtil.show(getActivity(), "服务器异常");
							break;
						case HMError.Register.ACCOUNT_EXIST:
							Log.d(TAG, "用户已经存在");
							ToastUtil.show(getActivity(), "用户已经存在");
							break;
						default:
							break;
						}
					}
				});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏三流程序员的挣扎

Android 单元测试 Robolectric

通过实现一套 JVM 能够运行的 Android 代码,从而实现脱离 Android 环境进行测试。

2463
来自专栏cloudskyme

大话企业级android读书笔记(三)

android中的数据存储类型包括:内存,普通文件,Shared Preferences,XML和SQLLite等 文件操作: 包括读写 /** * 【文件操...

3726
来自专栏向治洪

listview优化(中)

1,对Imageview使用setTag()方法来解决图片错位问题,这个Tag中设置的是图片的url,然后在加载的时候取得这个url和要加载那position...

22310
来自专栏Android先生

Android 使用代码实现一个选词(拖拽)填空题

在上一篇文章《Android 使用代码实现一个填空题》中,我们学习了如何实现一个填空题,今天继续接着上一篇文章的节奏,学习一下如何实现一个选词填空题,由于本文中...

1092
来自专栏技术小黑屋

避免Android中Context引起的内存泄露

Context是我们在编写Android程序经常使用到的对象,意思为上下文对象。 常用的有Activity的Context还是有Application的Cont...

901
来自专栏函数式编程语言及工具

Akka(31): Http:High-Level-Api,Route rejection handling

   Route 是Akka-http routing DSL的核心部分,使用户能比较方便的从http-server的角度筛选http-request、进行se...

2567
来自专栏向治洪

两个activity或者activity和fragment传值

使用Fragment的时候可能需要在两个Fragment之间进行参数的传递,开始想着可以使用SharedPreferences进行处理,想想这些简单的参数没有必...

3345
来自专栏俞其荣的博客

Android Architecture Component之Lifecycle解析HeaderLifecyclePart 1Part 2Part 3Footer

终于到了最后的关头,Android Architecture Component 系列的最后一节内容。今天给大家带来的就是 Lifecycle 的解析。

1704
来自专栏向治洪

android之listview缓存图片(缓存优化)

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决。下面提出一些优化: 1、采用线程池 2、内存缓存+文件缓存 3、内存缓存中网上很多是采用SoftRe...

3549
来自专栏Android 开发学习

Android Architecture Components 之LiveData, ViewModel

3014

扫码关注云+社区

领取腾讯云代金券