您的位置:首页 > 其它

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格式的如下结果:(代码中需要获取的城市和运营商黄色标注)

{"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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: