网络通信之获取网络文本

来源:互联网 发布:linux源代码在线阅读 编辑:程序博客网 时间:2024/05/21 15:50
获取网络文本
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线程传递数据;@Overrideprotected 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);}}


0 0
原创粉丝点击