作为安卓初学者写的一个简易demo:
直接上效果图

做这个app首先当然要去mob官网申请一个appkey,查看它的免费的手机号查询归属地api是怎么请求数据的,返回的又是什么样子的json数据

废话不多说,直接上代码:
activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditText
       android:id="@+id/edit"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入手机号"android:textSize="20dp" /><Button
       android:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="查询归属地"android:textSize="20dp"/><TextView
       android:id="@+id/text1"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20dp"android:textColor="@android:color/black"/><TextView
       android:id="@+id/text2"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20dp"android:textColor="@android:color/black"/><TextView
       android:id="@+id/text3"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20dp"android:textColor="@android:color/black"/><TextView
       android:id="@+id/text4"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20dp"android:textColor="@android:color/black"/><TextView
       android:id="@+id/text5"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20dp"android:textColor="@android:color/black"/><TextView
       android:id="@+id/text6"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20dp"android:textColor="@android:color/black"/>
</LinearLayout>

写一个PhoneBean.java来作为数据中转站,这当然不用自己写,把请求数据的网址复制到浏览器后就得到返回的json数据,然后把这堆json数据复制到在PhoneBean.java里按alt+s用gsonFormat插件直接生成bean实体类代码(也可以在线转http://www.bejson.com/json2javapojo/new/):

package com.ysk.phonetest;public class PhoneBean {/*** msg : success* result : {"city":"汕头市","cityCode":"0754","mobileNumber":"1341198","operator":"移动动感地带卡","province":"广东","zipCode":"515000"}* retCode : 200*/public ResultBean resultBean;private String msg;private ResultBean result;private String retCode;public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public ResultBean getResult() {return result;}public void setResult(ResultBean result) {this.result = result;}public String getRetCode() {return retCode;}public void setRetCode(String retCode) {this.retCode = retCode;}public static class ResultBean {/*** city : 汕头市* cityCode : 0754* mobileNumber : 1341198* operator : 移动动感地带卡* province : 广东* zipCode : 515000*/private String city;private String cityCode;private String mobileNumber;private String operator;private String province;private String zipCode;public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getCityCode() {return cityCode;}public void setCityCode(String cityCode) {this.cityCode = cityCode;}public String getMobileNumber() {return mobileNumber;}public void setMobileNumber(String mobileNumber) {this.mobileNumber = mobileNumber;}public String getOperator() {return operator;}public void setOperator(String operator) {this.operator = operator;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getZipCode() {return zipCode;}public void setZipCode(String zipCode) {this.zipCode = zipCode;}}
}

网络请求数据也要写一个工具类HttpUtil.java:

package com.ysk.phonetest;
import android.text.LoginFilter;
import android.util.Log;
import com.google.gson.Gson;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;/*** 用于进行网络请求*/
public class HttpUtil {/* public static final String APP_KEY= "2799678a59dbc";public static final String URL= "http://apicloud.mob.com/v1/mobile/address/query";*///发送消息到服务器public static PhoneBean sendPhone(String edittext){PhoneBean phoneBean = null;String gsonResult = doGet(edittext);Log.e("gsonResult",gsonResult);Gson gson = new Gson();if (gsonResult != null){try {phoneBean = gson.fromJson(gsonResult, PhoneBean.class);//解析数据到对应的实体类bean对象Log.e("phoneBean",phoneBean.getResult().getMobileNumber());Log.e("111", phoneBean.resultBean.getCity());}catch (Exception e){}}return phoneBean;//把值返回给调用本函数的函数。}public static String doGet(String edittext){String result = null;String url = setParmat(edittext);Log.e("url", url);OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(url).build();try {Response response=client.newCall(request).execute();result = response.body().string();} catch (IOException e) {e.printStackTrace();}Log.e("result", result);return result;}//设置参数public static String setParmat(String edittext){String url = "";url = "http://apicloud.mob.com/v1/mobile/address/query?key=2799678a59dbc&phone=" + edittext;return url;}
}

接下来是MainActivity.java:

package com.ysk.phonetest;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private  EditText editText;private TextView textView1,textView2,textView3,textView4,textView5,textView6;private Button button;private String meditText;private PhoneBean  resultBean;Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);//handler具体实现方法if(0 == msg.what){//如果标志号对的上resultBean = (PhoneBean) msg.obj;//那就是我要的信息if(null != resultBean){Log.e("=====","===="+resultBean);String City = resultBean.getResult().getCity();String CityCode = resultBean.getResult().getCityCode();String mobileNumber = resultBean.getResult().getMobileNumber();String operater=resultBean.getResult().getOperator();String province=resultBean.getResult().getProvince();String zigCode=resultBean.getResult().getZipCode();textView1.setText("城市:"+City);textView2.setText("区号:"+CityCode);textView3.setText("号码头:"+mobileNumber);textView4.setText("卡属性:"+operater);textView5.setText("省:"+province);textView6.setText("邮政编码:"+zigCode);}}else if(1 == msg.what){int num = (int)msg.obj;Log.e("message2中的obj",num+"");}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(Button)findViewById(R.id.button);editText=(EditText)findViewById(R.id.edit);textView1=(TextView)findViewById(R.id.text1);textView2=(TextView)findViewById(R.id.text2);textView3=(TextView)findViewById(R.id.text3);textView4=(TextView)findViewById(R.id.text4);textView5=(TextView)findViewById(R.id.text5);textView6=(TextView)findViewById(R.id.text6);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {meditText=editText.getText().toString().trim();//发送消息去服务端,并返回数据回来。这里是在线程中获取了数据,// 子线程不能直接更新主界面,因此得借用handler来进行主界面得更新new Thread(new Runnable() {@Overridepublic void run() {resultBean = HttpUtil.sendPhone(meditText);Log.e("11resultBean",resultBean.getResult().getCity().toString());//使用handler发送消息,通知主界面进行控件的赋值(界面的更新)Message message = new Message(); //消息实体类message.what = 0; //实体标志设为0message.obj = resultBean; //实体内容,整个resultBean打包handler.sendMessage(message); //发送消息方法/* Message message2 = new Message(); //消息实体类message.what = 1; //实体标志message.obj = 1; //实体内容handler.sendMessage(message2); //发送消息方法*/}}).start();// PhoneBean.ResultBean getCity=new PhoneBean.ResultBean();//新建的对象是没有值的/*  if(null != resultBean){Log.e("=====","====");String City = resultBean.getResult().getCity();textView.setText(City);}*/}});}
}

一般网络请求操作属于耗时操作,最好new一个子线程来进行网络请求操作,不过,子线程和主线程(除了new出来的子线程,其他都是属于主线程)之间的通信需要借助一个桥梁——handler,当然以后会有更多的其他桥梁,在此暂且学这个。
主线程相当于一条阳关大道,子线程相当于山阴小路,两者并不能直接传输数据,需要通过桥梁handler来进行传输数据,本程序中handler从子线程的网络请求数据所得到bean类那里充当运输消息的桥梁,传输数据到子线程之外——也就是主线程里去。

别忘了在AndroidManifest.xml里声明网络权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.INTERNET"/>

还有在build.gradle里面添加依赖库:

  implementation 'com.squareup.okhttp3:okhttp:3.7.0'implementation 'com.google.code.gson:gson:2.8.0'

关于handler基础知识的总结
我们创建的Service、Activity以及Broadcast均是一个主线程处理,可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现响应提示窗口,就可以考虑使用Thread子线程来解决。
那么Message 在Android里是什么? 对于Android中Handler可以传递一些内容,通过Bundle对象可以封装String、Integer以及Blob二进制对象,我们通过在线程中使用Handler对象的sendEmptyMessage或sendMessage方法来传递一个Bundle对象到Handler处理器。对于Handler类提供了重写方法handleMessage(Message msg) 来判断,通过msg.what来区分每条信息。将Bundle解包来实现Handler类更新UI线程中的内容实现控件的刷新操作。

一个基于mobapi的手机号码归属地查询的app相关推荐

  1. 基于python的手机号码归属信息查询系统

    import json import requests num = int(input('请输入你的手机号:')) url = 'http://apis.juhe.cn/mobile/get?phon ...

  2. 调用聚合数据API实现手机号码归属地查询

    调用聚合数据API实现手机号码归属地查询 1.作者介绍 2.相关介绍 2.1 什么是聚合数据? 2.2 API介绍 2.3 手机号码归属地 3.实验过程 3.1如何调用聚合数据API 3.2代码实现 ...

  3. Android 调用webservice(ksoap-2-Android)手机号码归属地查询

    之前做过一次但是隔了一个月再做就有点忘了,果然好记性不如烂笔头!还是打算记一下. 现在网络上的一些有关这方面的文章都比较久远了虽然方法没错但是之前的网址都变了所以需要进行一些修改. 记录时间2016/ ...

  4. python手机版代码-Python手机号码归属地查询代码

    简单的一个例子,是以前用Dephi写的,前不久刚实现了一个在Python中使用Delphi控件来编写界面程序,于是趁热写一个类似的的查询方案. 本实例是通过www.ip138.com这个网站来查询的, ...

  5. java手机号归属地查询_【原创】Java实现手机号码归属地查询

    网络上已经有很多的手机号码归属地查询的API接口,但是这些接口总是有一些大大小小的缺陷. 总结一下这些缺陷: 1.要直接将它的搜索框链接形式粘到自己的页面,点击查询的时候还要跳转到他们的网站来展示归属 ...

  6. java 手机号码归属地_【原创】Java实现手机号码归属地查询

    网络上已经有很多的手机号码归属地查询的API接口,但是这些接口总是有一些大大小小的缺陷. 总结一下这些缺陷: 1.要直接将它的搜索框链接形式粘到自己的页面,点击查询的时候还要跳转到他们的网站来展示归属 ...

  7. 【原创】Java实现手机号码归属地查询

    网络上已经有很多的手机号码归属地查询的API接口,但是这些接口总是有一些大大小小的缺陷. 总结一下这些缺陷: 1.要直接将它的搜索框链接形式粘到自己的页面,点击查询的时候还要跳转到他们的网站来展示归属 ...

  8. C# 自动投票和手机号码归属地查询 - 简单程序源码分享(高手飘过)

    C# 自动投票和手机号码归属地查询 - 简单程序源码分享(高手飘过) C# 自动投票和手机号码归属地查询 - 简单程序源码分享(高手飘过) 如有转载,请注明出处: http://www.cnblogs ...

  9. Python实现手机号码归属地查询功能

    文章目录 一.使用场景 二.问题描述 三.解决方案 四.方法补充 方法一: 方法二 一.使用场景 对手机号码进行地域分析,需要查询归属地: 二.问题描述 针对数据集比较大的情况,通过脚本来处理,使用多 ...

最新文章

  1. 分分钟入门【Nodejs】—初步了解Nodejs
  2. python复数类型-Python基本数据类型巩固题
  3. bootstrap table php,bootstrap table Tooltip
  4. Oracle10g安装步骤(一)
  5. python知识:*args 和**kwargs
  6. Java程序员应该收藏的书籍
  7. Spark集群的启动日志
  8. debian9.8无法切换中文输入法
  9. AgileEAS.NET平台-文档发布-还等什么?
  10. rust模组服如何切换标准服_资讯DNF手游将于3月20日发放10000个体验服资格(附申请方法)...
  11. python3.7.2怎么用不了pillow_python怎么加载Pillow包
  12. 牛顿插值算法MATLAB实现
  13. 社工库源码mysql_社工库源码
  14. Protel99SE应用技术问答(经典)
  15. 打造更安全的视频加密,云点播版权保护实践
  16. import torch报错画图问题Matplotlib created a temporary config/cache directory at /tmp/matplotl
  17. 国外问卷调查赚钱网站
  18. UMLChina公众号文章精选(20220918更新精选)
  19. (2022杭电多校三)1002-Boss Rush(状压DP+二分)
  20. 中国软件企业排名(不是绝对的)

热门文章

  1. Android HDCP开发小结
  2. 国内网络硬盘龙虎榜(转)
  3. c++网络开发必备dll---ssleay32.dll和libeay32.dll
  4. 关闭win8安全中心服务器,Win8系统启动安全中心服务的办法
  5. 电池的安规认证(IEC/EN)和航空运输认证UN38.3
  6. WdatePicker 日历控件使用支持6种日期类型(年份、月份、季度、周、日、小时)
  7. 通过acquire方法看懂RateLimiter限流机制
  8. 苹果CMSv10好看的自适应bt电影天堂美化高端模板源码
  9. animate.css+wow.js实现网页动画
  10. vivado设计4bit先行进位加法器 并使用 4bit CLA 组合设计一个 16bit 加法器