Android开发之基础------------------网络编程(一)
来源:互联网 发布:网络许可 编辑:程序博客网 时间:2024/05/21 17:47
一、获取请求网页的响应源码(网页源码查看器)
步骤:
1.写布局文件 布局文件说明:文本输入框用于输入请求的地址 设置按钮用于点击获取网页源码 显示在文本域中 文本域设置为带滚动条
<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=".MainActivity" > <EditText android:id="@+id/et_inputurl" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请输入url" /> <Button android:id="@+id/bt_getsource" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginTop="10dp" android:text="获取源码" > </Button> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/tv_showsource" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </ScrollView></LinearLayout>
逻辑部分:1.获取控件 设置按钮点击事件(获取源码) 使用handler处理UI更新操作(将获取的源码显示到文本域中)
package com.itheima.sourcecode_look;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;import com.itheima.sourcecode_look.utils.StreamUtils;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener {private EditText et_inputurl;private Button bt_getsource;private TextView tv_showsource;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//找到控件设置点击事件et_inputurl = (EditText) findViewById(R.id.et_inputurl);bt_getsource = (Button) findViewById(R.id.bt_getsource);tv_showsource = (TextView) findViewById(R.id.tv_showsource);bt_getsource.setOnClickListener(this);System.out.println("oncreate:"+Thread.currentThread().getName());}//***1.在主线程创建一个Handler对象Handler handler = new Handler(){//***2.重新handlerMessage方法public void handleMessage(android.os.Message msg) {//***5.主线程的handler对象中的handleMessage方法接收子线程发来的Message对象,获取message携带的数据,并处理数据String result = (String) msg.obj;//7.显示到textView上tv_showsource.setText(result);};};@Overridepublic void onClick(View v) {//获取用户输入的urlfinal String url_str = et_inputurl.getText().toString().trim();//由于4.0之后网络请求需要放到子线程,所以创建子线程执行网络请求new Thread(new Runnable() {@Overridepublic void run() {//请求服务器获取源码try{//1.获取一个URL对象URL url = new URL(url_str);//2.通过URL对象得到一个HttpURLConnection对象HttpURLConnection openConnection = (HttpURLConnection) url.openConnection();//3.设置HttpUrlConnection的一些参数,如:连接的超时时间,请求方式openConnection.setRequestMethod("GET");//设置连接的请求方式,类型一定要大写openConnection.setConnectTimeout(10*1000);//设置连接的超时时间//4.获取服务器响应的状态码,并判断int code = openConnection.getResponseCode();System.out.println("onclick:"+Thread.currentThread().getName());if(code == 200){//200 成功 206 请求部分资源成功 300 跳转 400 失败 500 服务器异常//5.得到连接的读取流,获取服务返回的内容。InputStream inputStream = openConnection.getInputStream();String result = StreamUtils.streamToString(inputStream);//***3.在子线程创建一个Message对象,用来携带子线程处理的结果Message msg = new Message();msg.obj = result;//***4.通过主线程创建的Handler来发送message对象到主线程handler.sendMessage(msg);//6.关闭链接 关闭流openConnection.disconnect();inputStream.close();}}catch (Exception e) {e.printStackTrace();}}}).start();}}工具类:将字节流转换成字符串
package com.itheima.sourcecode_look.utils;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;public class StreamUtils {public static String streamToString(InputStream inputStream) {ByteArrayOutputStream out = null;try{//创建一个内存写入流out = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = -1;while((len = inputStream.read(buffer)) != -1){out.write(buffer, 0, len);out.flush();}return out.toString();}catch (Exception e) {e.printStackTrace();}finally{try {if(out != null)out.close();} catch (IOException e) {e.printStackTrace();}}return null;}}注意事项:
1.ANR异常: anr(application not response) 主线程不能做耗时的操作(网络请求,大文件的拷贝,数据库的操作)
09-14 01:46:43.352: E/ActivityManager(858): ANR in com.itheima.sourcecode_look (com.itheima.sourcecode_look/.MainActivity)
2.网络运行在主线程异常。4.0版本之后google强制要求网络请求在子线程执行。
09-14 01:52:48.813: W/System.err(698): android.os.NetworkOnMainThreadException
3. 错误的线程调用异常:子线程不能够修改UI界面
09-14 01:57:06.213: W/System.err(764): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
结论:主线程不能够做耗时的操作,耗时的操作需要放到子线程做,但是子线程又不能更新UI(改变控件的内容和样式). 使用Handler解决这个问题。
Handler:消息处理机制 用于解决子线程不能更新UI。
写法步骤:
1.在主线程创建一个Handler对象
2.重写handler对象的handlerMessage方法
3.在子线程中创建一个Message对象用来携带子线程处理的结果。
4.使用主线程创建的handler在子线中将message发送到主线程
5.主线程中handler对象的handlerMessage方法接受子线程发送的Message对象,
获取message对象携带的数据,并处理UI界面的显示
代码体现:
//***1.在主线程创建一个Handler对象Handler handler = new Handler(){//***2.重新handlerMessage方法public void handleMessage(android.os.Message msg) {//***5.主线程的handler对象中的handleMessage方法接收子线程发来的Message对象,获取message携带的数据,并处理数据String result = (String) msg.obj;//7.显示到textView上tv_showsource.setText(result);};};
//***3.在子线程创建一个Message对象,用来携带子线程处理的结果Message msg = new Message();msg.obj = result;//***4.通过主线程创建的Handler来发送message对象到主线程handler.sendMessage(msg);
2015-10-3 北京市海淀区
0 0
- Android开发之基础------------------网络编程(一)
- Android开发之网络编程(一)
- Android网络编程(一)之Socket基础
- Android网络编程基础(一)
- iOS开发之网络编程(一)
- Android基础之二——网络编程(一)
- Android之Http网络编程(一)
- Android基础之网络编程
- Android开发之网络编程(二)
- 服务器开发【一】----网络编程的基础SOCKET(1)
- 网络编程基础(一)
- 网络编程基础(一)
- 网络编程基础(一)
- java网络socket编程(一)之基础简介
- android开发第四弹--网络编程之socket tcp/ip udp http(一)
- Android网络编程基础(一) - 基础知识
- 网络编程(一):网络基础之一
- iOS开发之网络编程基础
- new class students' list
- ZOJ-3798-Abs Problem
- 旅行商简化版 DP
- NSNotificationCenter defaultCenter笔记
- ARM汇编里面的关于cpsid.n中的.n解释
- Android开发之基础------------------网络编程(一)
- USACO 2.4 The Tamworth Two
- iOS之UI随笔-字典转模型以及双模型的构建
- HDU 5468 Puzzled Elena(容斥原理+dfs)
- linux 内存操作
- hdoj 3468 Treasure Hunting 【BFS找所有最短路径上的点 + 最大流】
- GOF 23 设计模式之 责任链模式(Chain Of Responsibility)
- Count Complete Tree Nodes
- POJ 1276 Cash Machine (多重背包)