做应用型的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的更多相关文章

  1. .Net程序员安卓学习之路1:登陆界面

    任何编程学习起步均是HelloWorld,作为稍有>net编程经验的我们来说就跳过这步吧,咱们且从简单登录界面开始.先看看效果: 一.准备知识: 1. 安卓环境:安装好JDK,直接去官网下载AD ...

  2. .Net程序员安卓学习之路4:使用xutils Get Post数据

    前面使用了一些网络上找来的类进行网络访问,后来发现了安卓开发中有一个国人写的类库xutils比较全面,也比较经典,故后续使用xutils类库进行记录. 本例服务端使用WCF来实现,写好的WCF服务端在 ...

  3. .Net程序员安卓学习之路6:等待条

    一般在需要访问网络或者长时间操作的时候避免界面无响应才使用:等待条 本例将实现一个无框架的等待条,效果如下: 点击后,使线程Sleep5秒,就出现如下效果: 实现代码如: private Progre ...

  4. .Net程序员安卓学习之路5:使用xutils注入View和事件以及图片的显示

    xUtils注入和图片显示 一.xUtils注入 引用官方介绍: ViewUtils模块: •android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定: •新的事件绑定方式,使用混淆工 ...

  5. .Net程序员安卓学习之路3:Post数据给网络API

    本例我们实现一次真正的网络交互,将数据POST到API,然后接收服务器的返回值进行处理,同时引入自定义类型和传说中阿里的FastJson. 实现思路如: 1. 在API端接收客户POST的数据还原成对 ...

  6. zz 游戏程序员的学习之路(中文版)

    游戏程序员的学习之路(中文版) Milo Yip · 1 天前 感谢 @楚天阔(tkchu)编写脚本及整理中文译本数据,自动从英文版生成中文版,SVG / PDF 版本中的书籍图片现在链接至豆瓣页面. ...

  7. GJM : 游戏程序员的学习之路

    原文作者:miloyip  原帖地址:http://gad.qq.com/article/detail/7180681 原帖备注:版权所有,禁止匿名转载:禁止商业使用:禁止个人使用. 腾讯前端技术总监 ...

  8. 五年.net程序员Java学习之路

    大学毕业后笔者进入一家外企,做企业CRM系统开发,那时候开发效率最高的高级程序语言,毫无疑问是C#.恰逢公司也在扩张,招聘了不少.net程序员,笔者作为应届生,也乐呵呵的加入到.net程序员行列中. ...

  9. 2017PHP程序员的进阶之路

    2017PHP程序员的进阶之路 又是一年毕业季,可能会有好多毕业生即将进入开发这个圈子,踏上码农这个不归路.根据这些年在开发圈子总结的LNMP程序猿发展轨迹,结合个人经验体会,总结出很多程序员对未来的 ...

随机推荐

  1. HDU 5033 Building

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5033 解题报告:在一条x轴上有n个建筑物,每个建筑物有一个高度h,然后现在有q次查询,查询的内容是假设 ...

  2. 获取su后执行的脚本的返回值

    错误的方式: # su - testuser -c "/tmp/test.sh; echo $?"Sun Microsystems Inc.   SunOS 5.10      G ...

  3. java用spring实现文件下载

    今天是我第一博客文章,希望写出来的东西能让大家看明白,欢迎大家给我留言. html页面: <a href="#" onclick="downLoad()" ...

  4. Colors

    .custom_a1, .custom_a2, .custom_a3, .custom_a4{ width:800px; height:100px; line-height:100px; color: ...

  5. Lua----注意事项

    前言:Lua相对一般的语言相对简单,有c基础看一遍就差不多了.一般的代码都能够看懂.但是Lua也有一些自己的特点,区别与其他语言,这里需要注意一下. 1.数组下标 在Lua中数组下标是从1开始计数的. ...

  6. hdu1004----用java链表实现

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  7. ReactiveCocoa 设置绑定注意事项

    要在ViewLoad里面进行绑定,因为在init中还没有初始化界面,所有绑定会无效

  8. vue 基础--&gt;进阶 教程(3):组件嵌套、组件之间的通信、路由机制

    前面的nodejs教程并没有停止更新,因为node项目需要用vue来实现界面部分,所以先插入一个vue教程,以免不会的同学不能很好的完成项目. 本教程,将从零开始,教给大家vue的基础.高级操作.组件 ...

  9. requireJS基础使用

    index.html <body class="requireBODY" id="body"><div id="vuebox&quo ...

  10. 【BZOJ1146】网络管理(主席树,树状数组)

    [BZOJ1146]网络管理(主席树,树状数组) 题面 BZOJ权限题,洛谷题面 题解 树上带修改主席树 貌似和\(Count\ On\ A\ Tree\)那题很相似呀 只需要套上一个树状数组来维护修 ...