android网络编程之初体验
来源:互联网 发布:传智播客java全套视频 编辑:程序博客网 时间:2024/05/22 09:47
今天刚刚开始看网络编程的内容,所以把今天看到的东西进行一下总结和记录。实例是根据在EditText中输入的网址从而通过按钮进入到这个网页中。
一、概述
网络编程是当今app开发必不可少的一项内容,即使app是本地软件,在无网络的时候可以使用,但是在后期有版本的升级和一旦有网便会进行广告推广,所以网络编程时必不可少的一项。
二、编程思想
1、 在这个实例中,会涉及到三个控件,所以先把这三个控件进行编写和布局。
2、 在mainActivity中找到这三个控件,在这里EditText和TextView两个控件要设计成成员变量,因为在后期要在try中进行读取EditText的内容和重写TextView的内容,如果不设成成员变量的话将会无法直接取得。
3、 设置按钮点击事件,点击之后进入到设定的网页中。
4、 在按钮的监听中要想进入到用户输入的网页中,主要就是网络请求的代码。网络请求的设计思想如下:
(1)定义一个url对象
(2)创建一个urlconnection对象
(3)设置一些connection的参数,包括超时时间,请求方式
(4)将数据读取到一个有效的位置
(5)将读取到的数据放到TextView中
public void onClick(View v) { //这个是没有使用子线程的事例,下边会改进使用子线程,并且会说明为什么要要子线程 String url = et_url.getText().toString().trim(); if (TextUtils.isEmpty(url)){ Toast.makeText(this,"访问的地址不对",Toast.LENGTH_LONG).show(); return; } try { //1。定义一个URl对象 URL get_url = new URL(url); //2。创建一个urlconnection对象 HttpURLConnection urlConnection = (HttpURLConnection)get_url.openConnection(); //3。设置一些connection的参数,包括超时时间,请求方式 urlConnection.setRequestMethod("GET"); urlConnection.setReadTimeout(1000*10); //10秒 int responseCode = urlConnection.getResponseCode(); //4将数据读取读取到一个有效的位置 if (responseCode == 200){ InputStream inputStream = urlConnection.getInputStream(); String result = Utils.streamtostring(inputStream); tv_display.setText(result); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } }
在读取数据的时候是用到了HttpUrlConnection对象的一个方法getInputStream(),从而得到了一个字节输入流,流是不能直接显示在TextView中的,因此需要将流转化成字符串,在这里将这个方法封装到了一个方法中。
public class Utils { //创建一个字节数组的字节输出流 static ByteArrayOutputStream array_out = new ByteArrayOutputStream(); public static String streamtostring(InputStream inputStream) { String result = null; byte[] buffer = new byte[1024]; int lenth = 0; try { while((lenth = inputStream.read())!=-1){ array_out.write(buffer,0,lenth); array_out.flush(); } } catch (IOException e) { e.printStackTrace(); } result = array_out.toString(); return result; }}
三、Handler消息机制问题:
在安卓中,涉及到网络请求、大容量的数据的传输以及数据库等耗时操作时,就不能在主线程中进行(注:如果在主线程中进去网络请求,网速不是很好的话,会在5秒的时候进行ANR提示,在android4.0之后,强制要求要将网络请求放在子线程中),要新开辟一个子线程来实现这些耗时操作。但是现在又出现了另外一个问题就是子线程是不安全的,所以不能再子线程中进行UI的更新,所以UI的更新要在主线程中进行。而我们子线程的数据又如何能够让主线程进行使用呢?这里就引出了Handler消息机制,他的目的就是将子线程的数据传至主线程中进行UI的更新。
Handler消息机制开发的流程和思路:
在主线程的开发:
创建一个Handler对象,采用匿名内部类的形式,然后将HandlerMessage方法进行重写,这个方法是必须重写的,目的就是接收来自子线程的数据。
在子线程的开发:
子线程中要创建一个Message对象,用来拿到子线程的数据,从而将子线程的数据传给主线程。
//在主线程中创建一个Handler对象private Handler handler = new Handler(){ //2重写handlermessager方法,用来接收子线程中发来的消息 @Override public void handleMessage(Message msg) { String result = (String) msg.obj; //子线程中的数据已经放到了Message的obj属性中了 tv_display.setText(result); } //3在子线程中操作};
Message message = new Message(); message.obj = result; handler.sendMessage(message);
四、handler消息机制的原理:
在安卓的应用中,主线程不适合处理耗时的操作,由子线程完成,而UI的更新需要主线程完成,这个消息的传递依靠handler的消息机制。而他的原理是什么呢?
在子线程中有Message信息,然后通过handler的sendMessage方法发送到主线程中的MessageQueue(消息队列),所有的来自子线程的消息Message都会存储到这个队列中,然后通过主线程中的looper(信息循环器)一直对MessageQueue进行检索,如果发现出现了新的Message,就会把新的消息交给Handler进行处理,直接更新UI。
0 0
- android网络编程之初体验
- Android开发学习之路--网络编程之初体验
- unix 网络编程之初体验
- iPhone之网络编程初体验-简单的聊天程序
- winSock网络编程初体验
- iPhone网络编程初体验
- android之网络编程
- Android之网络编程
- Android之网络编程
- Android 之初体验
- socket编程之初体验
- 新手写网络爬虫之初体验
- Android网络通信框架Volley初体验
- android之socket网络编程
- Android网络编程之WebView
- Android网络编程之httpclient
- Android网络编程之Http
- android网络编程之get
- 04使用harbor配置私仓
- C#里的Math方法
- jstl c:url 标签(类似 struts标签的 s:url)
- Nim Game
- HEXO+Github,搭建属于自己的博客(转)
- android网络编程之初体验
- Add Digits
- jstl 中的 包含标签<c:import>
- tableView使用SDWebImage加载图片时滚动优化
- linux下用户组添加
- *p++,(*p)++,*++p,++*p有什么不同??
- FrameLayout《第一行代码Android》学习笔记
- angularJS之ui-router
- 适合狠新手看的java基本概念