`
wen742538485
  • 浏览: 229353 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android 使用HTTPClient调用Web请求(查询手机号码区域)

阅读更多
Android通过Apache HttpClient调用网上提供的WebService服务,获取电话号码所属的区域。调用的服务的网址:

http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo

      

       以前用2.2 访问WebService没有问题,到3.0上访问出现android.os.NetworkOnMainThreadException

找了资料经过实践,解决方法如下:

     

Java代码 
///在Android2.2以后必须添加以下代码  
        //本应用采用的Android4.0  
        //设置线程的策略  
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()     
         .detectDiskReads()     
         .detectDiskWrites()     
         .detectNetwork()   // or .detectAll() for all detectable problems     
         .penaltyLog()     
         .build());     
        //设置虚拟机的策略  
          StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()     
                 .detectLeakedSqlLiteObjects()     
                 .detectLeakedClosableObjects()     
                 .penaltyLog()     
                 .penaltyDeath()     
                 .build()); 

///在Android2.2以后必须添加以下代码
//本应用采用的Android4.0
//设置线程的策略
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
         .detectDiskReads()  
         .detectDiskWrites()  
         .detectNetwork()   // or .detectAll() for all detectable problems  
         .penaltyLog()  
         .build());  
//设置虚拟机的策略
  StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
         .detectLeakedSqlLiteObjects()  
         .detectLeakedClosableObjects()  
         .penaltyLog()  
         .penaltyDeath()  
         .build());






似乎是3.0在网络上做了更加严格的限制,更多的查询API上的StrictMode 。。。。

项目结构如下:






实现代码如下:



Java代码 
package com.easyway.android.query.telephone;  
 
import java.util.ArrayList;  
import java.util.List;  
 
import org.apache.http.HttpResponse;  
import org.apache.http.HttpStatus;  
import org.apache.http.NameValuePair;  
import org.apache.http.client.HttpClient;  
import org.apache.http.client.entity.UrlEncodedFormEntity;  
import org.apache.http.client.methods.HttpPost;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.apache.http.message.BasicNameValuePair;  
import org.apache.http.protocol.HTTP;  
import org.apache.http.util.EntityUtils;  
 
import android.app.Activity;  
import android.os.Bundle;  
import android.os.StrictMode;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.EditText;  
import android.widget.TextView;  
 
/** 
* 利用网上提供的WebService使用 
* HttpClient运用之手机号码归属地查询 
* 参看WebService地址: 
*    http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo 
*     
*    可以采用 
*      SOAP1.1,SOAP1.2,HTTP GET,HTTP POST 
*  
* @author longggangbai 
*  
*/ 
public class AndroidQueryTelCodeActivity extends Activity {  
    private EditText phoneSecEditText;  
    private TextView resultView;  
    private Button queryButton;  
 
    @Override 
    public void onCreate(Bundle savedInstanceState) {  
        ///在Android2.2以后必须添加以下代码  
        //本应用采用的Android4.0  
        //设置线程的策略  
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()     
         .detectDiskReads()     
         .detectDiskWrites()     
         .detectNetwork()   // or .detectAll() for all detectable problems     
         .penaltyLog()     
         .build());     
        //设置虚拟机的策略  
          StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()     
                 .detectLeakedSqlLiteObjects()     
                 .detectLeakedClosableObjects()     
                 .penaltyLog()     
                 .penaltyDeath()     
                 .build());  
          
        super.onCreate(savedInstanceState);  
        //设置界面布局  
        setContentView(R.layout.main);  
        //初始化界面  
        initView();  
        //设置各种监听  
        setListener();  
    }  
    /** 
     * 界面相关的各种设置 
     */ 
    private void initView() {  
        //手机号码编辑器  
        phoneSecEditText = (EditText) findViewById(R.id.phone_sec);  
        //  
        resultView = (TextView) findViewById(R.id.result_text);  
        queryButton = (Button) findViewById(R.id.query_btn);  
    }  
    /** 
     * 设置各种事件监听的方法 
     */ 
    private void setListener() {  
        queryButton.setOnClickListener(new OnClickListener() {  
            @Override 
            public void onClick(View v) {  
                // 手机号码(段)  
                String phoneSec = phoneSecEditText.getText().toString().trim();  
                // 简单判断用户输入的手机号码(段)是否合法  
                if ("".equals(phoneSec) || phoneSec.length() < 7) {  
                    // 给出错误提示  
                    phoneSecEditText.setError("您输入的手机号码(段)有误!");  
                    //获取焦点  
                    phoneSecEditText.requestFocus();  
                    // 将显示查询结果的TextView清空  
                    resultView.setText("");  
                    return;  
                }  
                // 查询手机号码(段)信息  
                getRemoteInfo(phoneSec);  
            }  
        });  
    }  
 
    /** 
     * 手机号段归属地查询 
     *  
     * @param phoneSec 
     *            手机号段 
     */ 
    public void getRemoteInfo(String phoneSec) {  
        // 定义待请求的URL  
        String requestUrl = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo";  
        // 创建HttpClient实例  
        HttpClient client = new DefaultHttpClient();  
        // 根据URL创建HttpPost实例  
        HttpPost post = new HttpPost(requestUrl);  
 
        List<NameValuePair> params = new ArrayList<NameValuePair>();  
        // 设置需要传递的参数  
        params.add(new BasicNameValuePair("mobileCode", phoneSec));  
        params.add(new BasicNameValuePair("userId", ""));  
        try {  
            // 设置URL编码  
            post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));  
            // 发送请求并获取反馈  
            HttpResponse response = client.execute(post);  
 
            // 判断请求是否成功处理  
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
                // 解析返回的内容  
                String result = EntityUtils.toString(response.getEntity());  
                // 将查询结果经过解析后显示在TextView中  
                resultView.setText(filterHtml(result));  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
 
    /** 
     * 使用正则表达式过滤HTML标记 
     *  
     * @param source 
     *            待过滤内容 
     * @return 
     */ 
    private String filterHtml(String source) {  
        if (null == source) {  
            return "";  
        }  
        return source.replaceAll("</?[^>]+>", "").trim();  
    }  


package com.easyway.android.query.telephone;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

/**
* 利用网上提供的WebService使用
* HttpClient运用之手机号码归属地查询
* 参看WebService地址:
*    http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo
*   
*    可以采用
*      SOAP1.1,SOAP1.2,HTTP GET,HTTP POST
*
* @author longggangbai
*
*/
public class AndroidQueryTelCodeActivity extends Activity {
private EditText phoneSecEditText;
private TextView resultView;
private Button queryButton;

@Override
public void onCreate(Bundle savedInstanceState) {
///在Android2.2以后必须添加以下代码
//本应用采用的Android4.0
//设置线程的策略
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
         .detectDiskReads()  
         .detectDiskWrites()  
         .detectNetwork()   // or .detectAll() for all detectable problems  
         .penaltyLog()  
         .build());  
//设置虚拟机的策略
  StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
         .detectLeakedSqlLiteObjects()  
         .detectLeakedClosableObjects()  
         .penaltyLog()  
         .penaltyDeath()  
         .build());

super.onCreate(savedInstanceState);
//设置界面布局
setContentView(R.layout.main);
//初始化界面
        initView();
        //设置各种监听
setListener();
}
/**
* 界面相关的各种设置
*/
private void initView() {
//手机号码编辑器
phoneSecEditText = (EditText) findViewById(R.id.phone_sec);
//
resultView = (TextView) findViewById(R.id.result_text);
queryButton = (Button) findViewById(R.id.query_btn);
}
    /**
     * 设置各种事件监听的方法
     */
private void setListener() {
queryButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 手机号码(段)
String phoneSec = phoneSecEditText.getText().toString().trim();
// 简单判断用户输入的手机号码(段)是否合法
if ("".equals(phoneSec) || phoneSec.length() < 7) {
// 给出错误提示
phoneSecEditText.setError("您输入的手机号码(段)有误!");
//获取焦点
phoneSecEditText.requestFocus();
// 将显示查询结果的TextView清空
resultView.setText("");
return;
}
// 查询手机号码(段)信息
getRemoteInfo(phoneSec);
}
});
}

/**
* 手机号段归属地查询
*
* @param phoneSec
*            手机号段
*/
public void getRemoteInfo(String phoneSec) {
// 定义待请求的URL
String requestUrl = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo";
// 创建HttpClient实例
HttpClient client = new DefaultHttpClient();
// 根据URL创建HttpPost实例
HttpPost post = new HttpPost(requestUrl);

List<NameValuePair> params = new ArrayList<NameValuePair>();
// 设置需要传递的参数
params.add(new BasicNameValuePair("mobileCode", phoneSec));
params.add(new BasicNameValuePair("userId", ""));
try {
// 设置URL编码
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
// 发送请求并获取反馈
HttpResponse response = client.execute(post);

// 判断请求是否成功处理
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 解析返回的内容
String result = EntityUtils.toString(response.getEntity());
// 将查询结果经过解析后显示在TextView中
resultView.setText(filterHtml(result));
}
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 使用正则表达式过滤HTML标记
*
* @param source
*            待过滤内容
* @return
*/
private String filterHtml(String source) {
if (null == source) {
return "";
}
return source.replaceAll("</?[^>]+>", "").trim();
}
}





界面代码main.xml如下:


Java代码 
<?xml version="1.0" encoding="utf-8"?>    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    android:orientation="vertical"    
    android:layout_width="fill_parent"    
    android:layout_height="fill_parent"    
    android:paddingTop="5dip"    
    android:paddingLeft="5dip"    
    android:paddingRight="5dip"    
    >    
    <TextView    
        android:layout_width="fill_parent"     
        android:layout_height="wrap_content"     
        android:text="手机号码(段):"    
    />    
    <EditText android:id="@+id/phone_sec"    
        android:layout_width="fill_parent"    
        android:layout_height="wrap_content"    
        android:inputType="textPhonetic"    
        android:singleLine="true"    
        android:hint="例如:1398547(手机号码前8位)"    
    />    
    <Button android:id="@+id/query_btn"    
        android:layout_width="wrap_content"    
        android:layout_height="wrap_content"    
        android:layout_gravity="right"    
        android:text="查询"    
    />    
    <TextView android:id="@+id/result_text"    
        android:layout_width="wrap_content"     
        android:layout_height="wrap_content"     
        android:layout_gravity="center_horizontal|center_vertical"    
    />    
</LinearLayout>   

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingTop="5dip" 
    android:paddingLeft="5dip" 
    android:paddingRight="5dip" 
    > 
    <TextView 
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="手机号码(段):" 
    /> 
    <EditText android:id="@+id/phone_sec" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:inputType="textPhonetic" 
        android:singleLine="true" 
        android:hint="例如:1398547(手机号码前8位)" 
    /> 
    <Button android:id="@+id/query_btn" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="right" 
        android:text="查询" 
    /> 
    <TextView android:id="@+id/result_text" 
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_gravity="center_horizontal|center_vertical" 
    /> 
</LinearLayout> 
 


全局文件AndroidManifest.xml如下:






Java代码 
<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.easyway.android.query.telephone" 
    android:versionCode="1" 
    android:versionName="1.0" >  
 
    <uses-sdk android:minSdkVersion="14" />  
 
    <application  
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name" >  
        <activity  
            android:label="@string/app_name" 
            android:name=".AndroidQueryTelCodeActivity" >  
            <intent-filter >  
                <action android:name="android.intent.action.MAIN" />  
 
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
    </application>  
    <uses-permission android:name="android.permission.INTERNET" />    
 
</manifest> 
http://topmanopensource.iteye.com/blog/1283845
  • 大小: 32.8 KB
  • 大小: 14.9 KB
分享到:
评论

相关推荐

    SoapHttpClientBridge:Mono 中的 WebServices 的修复,它劫持了 Web 调用以使用 HttpClient 而不是默认的 WebRequest

    为了克服这个问题,您可以将整个架构切换为结合使用新的 HttpClient 库和 ModernHttpClient 组件,这样所有请求都将通过本机 http 客户端库实现(ios 和 android)进行路由。 由于这对我们来说不是一个选择(重建...

    疯狂Android讲义源码

     13.5.3 使用Android应用调用  Web Service 512  13.6 本章小结 524  第14章 管理Android手机桌面 525  14.1 管理手机桌面 526  14.1.1 删除桌面组件 526  14.1.2 添加桌面组件 526  14.2 改变手机壁纸 527 ...

    疯狂Android讲义.part1

    13.5.3 使用Android应用调用 Web Service 512 13.6 本章小结 524 第14章 管理Android手机桌面 525 14.1 管理手机桌面 526 14.1.1 删除桌面组件 526 14.1.2 添加桌面组件 526 14.2 改变手机壁纸 527 14.2.1 开发实时...

    Android典型技术模块开发详解

    10.4.3 分页查询 10.5 SQLite事务支持 10.6 Content Providers(数据共享) 10.6.1 ContentProvider基础类 10.6.2 继承ContentProvider类 10.6.3 使用ContentResolver操作ContentProvider中的数据 10.7 本章小结 第...

    httpp:使用C ++编写的Micro http服务器和客户端

    HttpClient已使用curl及其多接口实现。 或查看示例。 要求 需要Boost,版本&gt; = 1.54和libcurl。 从0.7版本开始,HTTPP就依赖于 。 CommonPP依赖于Boost和TBB。 TBB依赖关系将变为可选。 还需要符合C ++ 14的...

    java开源包1

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包8

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java开源包11

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包2

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包3

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包6

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包5

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包10

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包4

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包7

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

Global site tag (gtag.js) - Google Analytics