获取网络文本
1.使用URL封装一个地址
2.openConnection()得到HttpUrlConnection对象
3.getResponseCode()得到响应码
4.getInputStream()得到输入流读取数据
1.使用URL封装一个地址
2.openConnection()得到HttpUrlConnection对象
3.getResponseCode()得到响应码
4.getInputStream()得到输入流读取数据
注意: 安卓4.0以后联网需要开启新线程, 在新线程中操作界面还需要使用Handler
需要配置上网权限!!
示例代码:ClassicActivity.java
package com.itheima.nettext;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class ClassicActivity extends Activity {
private EditText et;
private TextView tv;
private TextService service;
private Handler handler = new Handler();//其他线程向UI线程传递数据;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et);//用于输入url地址的输入框
tv = (TextView) findViewById(R.id.tv);//用于显示获取到的网络文本;
service = new TextService(); //用来根据url地址获取文本;
}
public void go(View v) {
new Thread() {//主线程不能处理网络相关的代码,需要新开线程;
public void run() {
try {
String path = et.getText().toString().trim(); // 从EditText获取地址
final String text = service.getText(path); // 访问网络, 得到文本
handler.post(new Runnable() {
public void run() {
tv.setText(text); // tv由主线程创建,其他线程不能设置其文本,该段代码由主线程执行;设置到TextView中
}
});
} catch (Exception e) {
e.printStackTrace();
handler.post(new Runnable(){
public void run() {//弹出toast也必须由主线程执行;
Toast.makeText(getApplicationContext(), "服务器忙, 请稍后再试!", Toast.LENGTH_SHORT).show();
}
});
}
}
}.start();
}
}
TextService.java
package com.itheima.nettext;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.accounts.NetworkErrorException;
public class TextService {
public String getText(String path) throws Exception {
URL url = new URL(path); // 把路径封装成URL对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 打开连接对象(还未联网)
conn.setConnectTimeout(5000); // 设置超时时间, 如果连接超过5000毫秒未响应, 就抛出异常
int code = conn.getResponseCode(); // 获取响应码(真正联网)
if (code == 200) { // 如果成功
InputStream in = conn.getInputStream(); // 获取输入流
ByteArrayOutputStream out = new ByteArrayOutputStream(); // 可以写出数据到内存的输出流
byte[] buffer = new byte[8192];
int length;
while ((length = in.read(buffer)) != -1) // 从网络读取数据
out.write(buffer, 0, length); // 向内存写出数据
in.close();
out.close();
conn.disconnect();
byte[] data = out.toByteArray(); // 把写到内存的数据读取出来
String text = new String(data); // 解码为字符串(默认UTF-8)
return text;
}
conn.disconnect();
throw new NetworkErrorException("网络错误: " + code);
}
}