012_04Thread+Handler实例应用之号码归属地查询
2015-05-21 20:23
316 查看
在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以在你的子线程中拿到父线程中创建的Handler 对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。
每个handler 对应一个线程 thread , 在子线程中 handler 发送的消息会进入到 Message Queue当中去,由 looper 再来分发给 Handler 处理。
我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR(Application Not Responding)的响应提示窗口,这个时候我们可以考虑使用Thread线程来解决。
使用以下链接去浏览器中访问:
http://api.k780.com:88/app=phone.get&phone=18566669900
&appkey=14114&sign=ede788f7bf8d0678e281f660654ef995&format=xml
得到xml格式的如下结果:(代码中需要获取的城市和运营商黄色标注)
<root>
<success>1</success>
<result>
<status>ALREADY_ATT</status>
<phone>18566669900</phone>
<area>0755</area>
<postno>518000</postno>
<att>中国,广东,深圳</att>
<ctype>联通185卡</ctype>
<par>1856666</par>
<prefix>185</prefix>
<operators>联通</operators>
<style_simcall>中国,广东,深圳</style_simcall>
<style_citynm>中华人民共和国,广东省,深圳市</style_citynm>
</result>
</root>
使用以下链接去浏览器中访问:
http://api.k780.com:88/app=phone.get&phone=18566669900
&appkey=14114&sign=ede788f7bf8d0678e281f660654ef995&format=json
得到json格式的如下结果:(代码中需要获取的城市和运营商黄色标注)
查询效果图:
第一个按钮“查询”是使用HttpURLConnection+Thread+Handler+xml解析去获取;
第二个按钮“json查询”是使用HttpURLConnection+Thread+Handler+json解析去获取;
第三个按钮“使用Async-http-master xml查询”是使用AsyncHttpClient+AsyncHttpResponseHandler+xml解析去获取;
第四个按钮“使用Async-http-master json查询”是使用AsyncHttpClient+AsyncHttpResponseHandler+json解析去获取;
每个handler 对应一个线程 thread , 在子线程中 handler 发送的消息会进入到 Message Queue当中去,由 looper 再来分发给 Handler 处理。
我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR(Application Not Responding)的响应提示窗口,这个时候我们可以考虑使用Thread线程来解决。
使用以下链接去浏览器中访问:
http://api.k780.com:88/app=phone.get&phone=18566669900
&appkey=14114&sign=ede788f7bf8d0678e281f660654ef995&format=xml
得到xml格式的如下结果:(代码中需要获取的城市和运营商黄色标注)
<root>
<success>1</success>
<result>
<status>ALREADY_ATT</status>
<phone>18566669900</phone>
<area>0755</area>
<postno>518000</postno>
<att>中国,广东,深圳</att>
<ctype>联通185卡</ctype>
<par>1856666</par>
<prefix>185</prefix>
<operators>联通</operators>
<style_simcall>中国,广东,深圳</style_simcall>
<style_citynm>中华人民共和国,广东省,深圳市</style_citynm>
</result>
</root>
使用以下链接去浏览器中访问:
http://api.k780.com:88/app=phone.get&phone=18566669900
&appkey=14114&sign=ede788f7bf8d0678e281f660654ef995&format=json
得到json格式的如下结果:(代码中需要获取的城市和运营商黄色标注)
{"success":"1","result":{"status":"ALREADY_ATT","phone":"18566669900","area":"0755","postno":"518000","att":"中国,广东,深圳","ctype":"联通185卡","par":"1856666","prefix":"185","operators":"联通","style_simcall":"中国,广东,深圳","style_citynm":"中华人民共和国,广东省,深圳市"}}
查询效果图:
第一个按钮“查询”是使用HttpURLConnection+Thread+Handler+xml解析去获取;
第二个按钮“json查询”是使用HttpURLConnection+Thread+Handler+json解析去获取;
第三个按钮“使用Async-http-master xml查询”是使用AsyncHttpClient+AsyncHttpResponseHandler+xml解析去获取;
第四个按钮“使用Async-http-master json查询”是使用AsyncHttpClient+AsyncHttpResponseHandler+json解析去获取;
package com.example.day12_04phonenumberqurey; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import org.apache.http.Header; import org.json.JSONException; import org.json.JSONObject; import org.xmlpull.v1.XmlPullParser; import com.cskaoyan.webutils.WebUtils; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.util.Xml; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { public static final String TAG = "phonenumberqurey"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } Handler hanlder = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: TextView tv_loaction = (TextView) findViewById(R.id.tv_location); tv_loaction.setText((String)msg.obj); break; case 2: Toast.makeText(MainActivity.this, (String)msg.obj, 0).show(); break; default: break; } } }; public void query(View v){ //先获取电话号码 EditText et_number = (EditText) findViewById(R.id.et_number); String number = et_number.getText().toString(); //http://api.k780.com:88...提供电话号码归属地查询的数据接口 final String path ="http://api.k780.com:88/?app=phone.get&phone=" +number+"&appkey=14114&sign=ede788f7bf8d0678e281f660654ef995&format=xml"; //发请求的线程 Thread thread = new Thread(){ public void run() { try { URL url = new URL(path); HttpURLConnection conn= (HttpURLConnection) url.openConnection(); conn.setReadTimeout(5000); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); conn.connect(); String city =null; String operator = null; if(conn.getResponseCode()==200) { //登陆成功 //登陆失败? InputStream is= conn.getInputStream(); //String text = WebUtils.gettextFromInputStream(is, null); XmlPullParser pullparser = Xml.newPullParser(); pullparser.setInput(is, "UTF-8"); //得到读取到的某部分的类型 int evenType = pullparser.getEventType(); while(evenType!=XmlPullParser.END_DOCUMENT) { if (evenType==XmlPullParser.START_TAG) { Log.i(TAG, "START_TAG"+pullparser.getName()); if ("operators".equals(pullparser.getName())) { operator=pullparser.nextText(); } if ("style_citynm".equals(pullparser.getName())) { city=pullparser.nextText(); } } evenType=pullparser.next(); } Log.i(TAG,operator+":"+city); Message msg = hanlder.obtainMessage(); msg.what=1; if(city==null||operator==null) { msg.obj="没有查询到结果"; } else { msg.obj= city+":"+operator; } hanlder.sendMessage(msg); } else { Message msg = hanlder.obtainMessage(); msg.what=2; msg.obj="没有链接到服务器"; hanlder.sendMessage(msg); } } catch (Exception e) { e.printStackTrace(); } }; }; thread.start(); } public void querybyjson(View v){ //先获取电话号码 EditText et_number = (EditText) findViewById(R.id.et_number); String number = et_number.getText().toString(); final String path ="http://api.k780.com:88/?app=phone.get&phone="+ number+"&appkey=14114&sign=ede788f7bf8d0678e281f660654ef995&format=json"; //发请求的线程 Thread thread = new Thread() { public void run() { try { URL url = new URL(path); HttpURLConnection conn= (HttpURLConnection) url.openConnection(); conn.setReadTimeout(5000); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); conn.connect(); String city =null; String operator = null; if(conn.getResponseCode()==200) { //登陆成功 //登陆失败? InputStream is= conn.getInputStream(); String text = WebUtils.gettextFromInputStream(is, null); JSONObject jsonObject = new JSONObject(text); JSONObject result = jsonObject.getJSONObject("result"); city= result.getString("style_citynm"); operator = result.getString("operators"); Log.i(TAG,operator+":"+city); Message msg = hanlder.obtainMessage(); msg.what=1; if(city==null||operator==null) msg.obj="没有查询到结果"; else msg.obj= city+":"+operator; hanlder.sendMessage(msg); } else { Message msg = hanlder.obtainMessage(); msg.what=2; msg.obj="没有链接到服务器"; hanlder.sendMessage(msg); } } catch (Exception e) { e.printStackTrace(); } }; }; thread.start(); } public void querybyxml_async(View v) { EditText et_number = (EditText) findViewById(R.id.et_number); String number = et_number.getText().toString(); final String path ="http://api.k780.com:88/?app=phone.get&phone="+ number+"&appkey=14114&sign=ede788f7bf8d0678e281f660654ef995&format=xml"; AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); asyncHttpClient.post(path, new Myhandler2()); } public void querybyjson_aysnc(View v) { EditText et_number = (EditText) findViewById(R.id.et_number); String number = et_number.getText().toString(); final String path ="http://api.k780.com:88/?app=phone.get&phone="+ number+"&appkey=14114&sign=ede788f7bf8d0678e281f660654ef995&format=json"; AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); asyncHttpClient.post(path, new Myhandler()); } class Myhandler extends AsyncHttpResponseHandler { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { String city =null; String operator = null; JSONObject jsonObject =null; try { jsonObject = new JSONObject(new String(responseBody)); JSONObject result = jsonObject.getJSONObject("result"); city= result.getString("style_citynm"); operator = result.getString("operators"); } catch (JSONException e) { e.printStackTrace(); } TextView tv_loaction = (TextView) findViewById(R.id.tv_location); tv_loaction.setText(city+":"+operator); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // TODO Auto-generated method stub } } class Myhandler2 extends AsyncHttpResponseHandler { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { String city =null; String operator = null; XmlPullParser pullparser = Xml.newPullParser(); ByteArrayInputStream bais= new ByteArrayInputStream(responseBody); try { pullparser.setInput(bais, "utf-8"); //得到读取到的某部分的类型 int evenType = pullparser.getEventType(); while(evenType!=XmlPullParser.END_DOCUMENT){ if (evenType==XmlPullParser.START_TAG) { Log.i(TAG, "START_TAG"+pullparser.getName()) ; if ("operators".equals(pullparser.getName())) { operator=pullparser.nextText(); } if ("style_citynm".equals(pullparser.getName())) { city=pullparser.nextText(); } } evenType=pullparser.next(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } TextView tv_loaction = (TextView) findViewById(R.id.tv_location); tv_loaction.setText(city+":"+operator); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // TODO Auto-generated method stub } } }
package com.cskaoyan.webutils; import java.io.ByteArrayOutputStream; import java.io.InputStream; public class WebUtils { public static String gettextFromInputStream(InputStream is ,String charset){ String text = null; if(charset==null){ charset="utf-8"; } try { ByteArrayOutputStream baos= new ByteArrayOutputStream(); byte[] b = new byte[1024]; int len = 0; while ((len=is.read(b))!=-1) { baos.write(b, 0, len); } baos.close(); text = new String(baos.toByteArray(), charset); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return text; } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.day12_04phonenumberqurey.MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="归属地查询" /> <EditText android:id="@+id/et_number" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="querybyxml" android:text="查询" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="querybyjson" android:text="json查询" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="querybyxml_async" android:text="使用Async-http-master xml查询" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="querybyjson_aysnc" android:text="使用Async-http-master json查询" /> <TextView android:id="@+id/tv_location" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="归属地"/> </LinearLayout>
相关文章推荐
- jquery使用淘宝接口跨域查询手机号码归属地实例
- jquery使用淘宝接口跨域查询手机号码归属地实例
- jquery使用淘宝接口跨域查询手机号码归属地实例
- 免费手机号码归属地API查询接口和PHP使用实例分享
- 免费手机号码归属地API查询接口和PHP使用实例分享
- jquery使用淘宝接口跨域查询手机号码归属地实例
- WebService学习------小实例开发(号码归属地查询)
- 通达OA工作流应用实例,列表控件使用,二开设计查询页面
- 给大家推荐一个查询手机号码归属地和IP物理地址及whois的网站
- oc 字典应用实例-城市查询省份
- Android开发之号码归属地查询
- java语言实现号码归属地查询
- PHP实现国内手机号码归属地查询
- 手机号码归属地查询api接口
- 手机号码归属地查询API接口
- 做一个程序来查询手机号码的归属地(使用的是HttpURLConnection的post提交方式)
- 免费手机号码归属地API查询接口
- Android 号码,来电归属地 Jni 使用C++对二进制文件查询(一) 理论篇
- Yii2.0数据库查询应用实例(一)