android+geturl+方法,浅入浅出Android(014):HTTP GET获取文本内容
1、建立android项目MyApplication
2、修改布局文件activity_my.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MyActivity">
android:id="@+id/button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取网页内容" />
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/button01">
android:id="@+id/textview01"
android:text=""
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
ScrollView用于给Textview添加滚动条。
3、添加联网权限 在AndroidManifest.xml添加,文件最终内容是:
package="com.example.letian.myapplication" >
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:name=".MyActivity"
android:label="@string/app_name" >
4、修改MyActivity.java
package com.example.letian.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
final Button btn01 = (Button) this.findViewById(R.id.button01);
final TextView tv01 = (TextView) this.findViewById(R.id.textview01);
btn01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tv01.setText(getUrlContent("http://www.oschina.net/"));
}
});
}
private String getUrlContent(String url) {
HttpGet getRequest = new HttpGet(url);
getRequest.addHeader("User-Agent", " Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0");
try {
HttpResponse response = new DefaultHttpClient().execute(getRequest);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line = ""; //存储读取的一行内容
String NL = System.getProperty("line.separator"); //换行符
while ((line = in.readLine()) != null) {
sb.append(line+NL);
}
in.close();
return sb.toString();
} else {
return "读取失败:\n"+response.getStatusLine().getStatusCode();
}
} catch (Exception e) {
return "读取失败:\n"+e.toString();
}
}
}
5、但是运行结果并不令人满意,出现异常
网页请求时一个阻塞的过程,如果时间过长会造成程序假死,所以产生了该异常。这个异常在较新版本的Android中才提出。
6、一个并不推荐的解决办法
该方法可能会造成程序假死,所以最好不要在app中使用该方法。
在onCreate()的适当位置添加如下内容:
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
} app运行结果如下:
7、使用线程的方法来解决(推荐)
将MyActivity.java修改如下:
package com.example.letian.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
final Button btn01 = (Button) this.findViewById(R.id.button01);
final TextView tv01 = (TextView) this.findViewById(R.id.textview01);
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle data = msg.getData();
tv01.setText(data.getString("value"));
}
};
final Runnable runnable = new Runnable(){
@Override
public void run() {
String result = getUrlContent("http://www.oschina.net/");
Message msg = new Message();
Bundle data = new Bundle();
data.putString("value", result);
msg.setData(data);
handler.sendMessage(msg);
}
};
btn01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(runnable).start();
}
});
}
/**
* 获取url对应的网页内容
* @param url
* @return
*/
private String getUrlContent(String url) {
HttpGet getRequest = new HttpGet(url);
getRequest.addHeader("User-Agent", " Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0");
try {
HttpResponse response = new DefaultHttpClient().execute(getRequest);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line = ""; //存储读取的一行内容
String NL = System.getProperty("line.separator"); //换行符
while ((line = in.readLine()) != null) {
sb.append(line+NL);
}
in.close();
return sb.toString();
} else {
return "读取失败:\n"+response.getStatusLine().getStatusCode();
}
} catch (Exception e) {
return "读取失败:\n"+e.toString();
}
}
}
参考:
http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception
Android编程典型实例与项目开发 吴亚峰等编
android+geturl+方法,浅入浅出Android(014):HTTP GET获取文本内容相关推荐
- 看雪学院-浅入浅出Android安全 笔记
Note 看雪学院-浅入浅出Android安全 原作地址:http://www.kanxue.com/?article-read-547.htm 翻译作者:飞龙 Android 由四个层组成:Linu ...
- 浅入浅出 Android 安全 翻译完成!
浅入浅出 Android 安全 翻译完成! 作者:Yury Zhauniarovich 译者:飞龙 来源:Yury Zhauniarovich | Publications 在线阅读 PDF格式 EP ...
- Java 注解 (Annotation)浅入深出
Java 注解 (Annotation)浅入深出 本文主要参考与借鉴frank909 文章,但更为简单,详细. Annotation 中文译过来就是注解.标释的意思.Annotation是一种应用于类 ...
- [科普]浅入浅出Liunx Shellcode
创建时间:2008-05-13 文章属性:原创 文章提交: pr0cess (pr0cess_at_cnbct.org) 浅入浅出Liunx Shellcode /*---------------- ...
- 浅入深出之Java集合框架(上)
Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到浅入深出之Java集合框架(下). ...
- 浅入深出之Java集合框架(中)
Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到浅入深出之Java集合框架(下). ...
- SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程
函数式编程(Functional Programming),一看这个词,简直就是学院派的典范. 以至于从 Lisp 的创世,到 Scheme.Haskell.Clean.Erlang.Miranda. ...
- 浅入浅出深度学习理论实践
全文共9284个字,40张图,预计阅读时间30分钟. 前言 之前在知乎上看到这么一个问题:在实际业务里,在工作中有什么用得到深度学习的例子么?用到 GPU 了么?,回头看了一下自己写了这么多东西一直围 ...
- 处理中文乱码_浅入深出:一次提问引发的深思,从此再也不怕“乱码”问题
这是恋习Python之浅入深出系列第3篇原创首发文章 作者|丁彦军 来源|恋习Python(ID:sldata2017) 转载请联系授权(微信ID:2394608316) 近日,有位粉丝向我请教,在爬 ...
- Spring MVC浅入浅出——不吹牛逼不装逼
Spring MVC浅入浅出--不吹牛逼不装逼 前言 上文书说了Spring相关的知识,对Spring来了个浅入浅出,大家应该了解到,Spring在三层架构中主做Service层,那还有Web层,也就 ...
最新文章
- Flash传值给asp页面
- Matlab与线性代数 -- 全1矩阵
- 超强1000个jquery极品插件!(连载中。。。。最近更新20090710)
- linux nmcli源码,Linux上利用nmcli命令创建网络组(示例代码)
- nodejs+express +jade模板引擎 新建项目
- 数学--数论--(逆元)扩展欧几里求解+证明
- button点击后变色_汽车改色膜新潮流,2021年流行渐变色
- mysql被除数为0不报错_MySQL:关系除法
- 大数据学习笔记41:Hive - 用户自定义函数
- gnome桌面环境 kde桌面环境的区别
- Java数据结构与算法(3) - ch04栈(栈和转置)
- React Native重构路线图发布!
- JAVA网站后台管理系统
- PT100热敏电阻原理解析
- win7万能声卡驱动_我把一台PC的操作系统从win7换成了win10,它真的很棒!
- 蓝桥杯——鲁卡斯队列
- nodejs多房间web聊天室
- 阿里笔试之Java分词统计
- 基于BERT做中文文本分类(情感分析)
- 个人永久性免费-Excel催化剂功能第41波-文件文件夹相关函数