.Net程序员安卓学习之路2:访问网络API
做应用型的APP肯定是要和网络交互的,那么本节就来实战一把Android访问网络API,还是使用上节的DEMO:

一、准备API:
一般都采用Json作为数据交换格式,目前各种语言均能输出Json串。
假如使用PHP输出一段简单的Json,可以这么写:
<?php
$arr = array ('users'=>array('mady','123'));
echo json_encode($arr);
?>
输出的Json如下:
{"users":["mady","123"]}
也可以使用VS创建一个API直接序列化一个数组,或者其他任何方式只要数据格式正确就没问题。
二、实现网络API访问:
首先访问网络需要授权,也就是安装时提醒打对勾的那部分:
打开Bin/res/AndroidManifest.xml在根节点下面加入一个授权申请节点:
<uses-permission android:name="android.permission.INTERNET"/>
然后是访问网络,这里有一段从网上来的访问类:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils; public class HttpUtils
{
/**
* @param path 请求的服务器URL地址
* @param encode 编码格式
* @return 将服务器端返回的数据转换成String
*/
public static String sendPostMessage(String path, String encode)
{
String result = "";
HttpClient httpClient = new DefaultHttpClient();
try
{
HttpPost httpPost = new HttpPost(path);
HttpResponse httpResponse = httpClient.execute(httpPost);
if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
{
HttpEntity httpEntity = httpResponse.getEntity();
if(httpEntity != null)
{
result = EntityUtils.toString(httpEntity, encode);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
httpClient.getConnectionManager().shutdown();
} return result;
}
}
还有一段从网上来的Json解析类,使用Android自带的解析库:
import java.util.ArrayList;
import java.util.List; import org.json.JSONArray;
import org.json.JSONObject; public class JsonUtil
{
/**
* @param citiesString 从服务器端得到的JSON字符串数据
* @return 解析JSON字符串数据,放入List当中
*/
public static List<String> parseCities(String citiesString)
{
List<String> cities = new ArrayList<String>(); try
{
JSONObject jsonObject = new JSONObject(citiesString);
JSONArray jsonArray = jsonObject.getJSONArray("users");
for(int i = 0; i < jsonArray.length(); i++)
{
cities.add(jsonArray.getString(i));
}
}
catch (Exception e)
{
e.printStackTrace();
} return cities;
}
}
最后需要注意的就是在Android中访问网络必须是异步方式,同步方式直接报错,所以需要增加异步访问:
public class MyAsyncTask extends AsyncTask<String, Void, List<String>>
{
@Override
protected void onPreExecute()
{
super.onPreExecute();
}
@Override
protected List<String> doInBackground(String... params)
{
List<String> cities = new ArrayList<String>();
String citiesString = HttpUtils.sendPostMessage(params[0], "utf-8");
cities = JsonUtil.parseCities(citiesString);
return cities;
}
@Override
protected void onPostExecute(List<String> result)
{
TextView lblInfo=(TextView)findViewById(R.id.form_title);
EditText txt_login_name=(EditText)findViewById(R.id.txt_login_name);
EditText txt_login_pass=(EditText)findViewById(R.id.txt_login_pwd);
String loginName=txt_login_name.getText().toString().trim();
String loginPass=txt_login_pass.getText().toString().trim(); if(loginPass.equals(result.get(1))&&loginName.equals(result.get(0)))
{
lblInfo.setText("登录成功!");
}
else
{
lblInfo.setText("登录失败!");
} super.onPostExecute(result);
}
}
分为访问前、访问中、访问后(估计是方便增加进度条),我们在访问后增加处理代码即可,然后在上节的按钮点击事件下调用:
private final String CITY_PATH_JSON = "http://192.168.1.6:89/Login2.php";
public void btn_click(View v)
{
new MyAsyncTask().execute(CITY_PATH_JSON);
}
唯一需要的说明:访问后的Result类型就是访问中的返回值类型
唯二需要哦的说明:API必须架设在另外的机器上,而且必须使用IP访问,因为localhost和127都被模拟器自己用了.
先看看登录的用户名和密码是什么,访问下API:

运行APP:

输入正确的信息:

.Net程序员安卓学习之路2:访问网络API的更多相关文章
- .Net程序员安卓学习之路1:登陆界面
任何编程学习起步均是HelloWorld,作为稍有>net编程经验的我们来说就跳过这步吧,咱们且从简单登录界面开始.先看看效果: 一.准备知识: 1. 安卓环境:安装好JDK,直接去官网下载AD ...
- .Net程序员安卓学习之路4:使用xutils Get Post数据
前面使用了一些网络上找来的类进行网络访问,后来发现了安卓开发中有一个国人写的类库xutils比较全面,也比较经典,故后续使用xutils类库进行记录. 本例服务端使用WCF来实现,写好的WCF服务端在 ...
- .Net程序员安卓学习之路6:等待条
一般在需要访问网络或者长时间操作的时候避免界面无响应才使用:等待条 本例将实现一个无框架的等待条,效果如下: 点击后,使线程Sleep5秒,就出现如下效果: 实现代码如: private Progre ...
- .Net程序员安卓学习之路5:使用xutils注入View和事件以及图片的显示
xUtils注入和图片显示 一.xUtils注入 引用官方介绍: ViewUtils模块: •android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定: •新的事件绑定方式,使用混淆工 ...
- .Net程序员安卓学习之路3:Post数据给网络API
本例我们实现一次真正的网络交互,将数据POST到API,然后接收服务器的返回值进行处理,同时引入自定义类型和传说中阿里的FastJson. 实现思路如: 1. 在API端接收客户POST的数据还原成对 ...
- zz 游戏程序员的学习之路(中文版)
游戏程序员的学习之路(中文版) Milo Yip · 1 天前 感谢 @楚天阔(tkchu)编写脚本及整理中文译本数据,自动从英文版生成中文版,SVG / PDF 版本中的书籍图片现在链接至豆瓣页面. ...
- GJM : 游戏程序员的学习之路
原文作者:miloyip 原帖地址:http://gad.qq.com/article/detail/7180681 原帖备注:版权所有,禁止匿名转载:禁止商业使用:禁止个人使用. 腾讯前端技术总监 ...
- 五年.net程序员Java学习之路
大学毕业后笔者进入一家外企,做企业CRM系统开发,那时候开发效率最高的高级程序语言,毫无疑问是C#.恰逢公司也在扩张,招聘了不少.net程序员,笔者作为应届生,也乐呵呵的加入到.net程序员行列中. ...
- 2017PHP程序员的进阶之路
2017PHP程序员的进阶之路 又是一年毕业季,可能会有好多毕业生即将进入开发这个圈子,踏上码农这个不归路.根据这些年在开发圈子总结的LNMP程序猿发展轨迹,结合个人经验体会,总结出很多程序员对未来的 ...
随机推荐
- BZOJ1845 : [Cqoi2005] 三角形面积并
求出所有交点后从左往右扫描线,用每段的中位线去截所有三角形,算出长度并后乘以该段长度即可,时间复杂度$O(n^3\log n)$. #include<cstdio> #include< ...
- CSS3 box-shadow快速教程
box-shadow 属性向框添加一个或多个阴影.这个CSS3的属性很常用,盒阴影.按钮状态等各种地方都有用到,但是你了解并记住各个参数的作用及用法吗? 展示 源码:http://codepen.io ...
- xubuntu12.04配置
更改源:我用上海交通大学的 首先备份Ubuntu12.04源列表sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup #(备份下当前 ...
- IE6不支持li:hover的解决办法,一句代码让IE6支持li:hover
如果不是因为工作需要,我根本不会理会IE6的兼容问题,甚至我都不想理会IE的所有内核,不过IE9用了下,我还是重新对IE报以期待的.话题扯远了,下面回到话题上来吧.这次要说的内容就是,如果让IE支持l ...
- [转载]git 忽略某些文件
项目中经常会生成一些Git系统不需要追踪(track)的文件.典型的是在编译生成过程中 产生的文件或是编程器生成的临时备份文件.当然,你不追踪(track)这些文件,可以 平时不用"git ...
- hdu 3348 coins
这道题算是一道很经典的题,很好的诠释了贪心和动态规划的不同功能.求最少钱的数量用贪心就够了,但是求最多钱的数量要用到动态规划的思想,每步都尽量保留最大 数量.具体看程序注解: #include&quo ...
- hdu 最大报销额
本题也是一个背包的问题,我觉得这道题的核心就是根据精确度将浮点型转化为整型然后利用动态规划进行求解,注意对题意的理解,有3种支票是不能够报销的. 我开始照着这个思路进行思考,但是敲出来的第一个代码居然 ...
- MUI - 预加载
预加载都是在mui.init({)}中执行的 方式一:preload一次仅能预加载一个页面(除非循环) var subWebview = mui.preload({ url: 'examples/ac ...
- Yii2.0 URL美化
1. 程序初始化注册文件,加入如下: 'urlManager' =>[ 'class' => 'yii\web\UrlManager', 'showScriptName' =>fal ...
- php运行模式的比较(转)
PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli 命令行运行 ( ...