简单例子开头: 网络http请求网站源码数据并显示

  注意点:访问网络需要加Internet权限:
      android.permission.INTERNET

简单的步骤:

使用UrlConnection请求一个url地址获取内容:

//1.创建一个Url对象
  URL url = new URL(url_str);

//2.获取一个UrlConnection对象
  HttpURLConnection connection = (HttpURLConnection)url.openConnection();

//3.为UrlConnection对象设置一些请求的参数,请求方式,连接的超时时间
  connection.setRequestMethod("GET");//设置请求方式
  connection.setConnectTimeout(1000*10);//设置超时时间

//4.在获取url请求的数据前需要判断响应码,200 :成功,206:访问部分数据成功 300:跳转或重定向 400:错误 500:服务器异常
  int code = connection.getResponseCode();
  if(code == 200){

//5.获取有效数据,并将获取的流数据解析成String
  InputStream inputStream = connection.getInputStream();
  String result = StreamUtils.streamToString(inputStream);
  }

注意:

(1)主线程不能够做耗时的操作,网络请求就是耗时的操作需要放到子线程做。
(2)子线程不能更新控件的内容(更新Ui)。所以产生了矛盾,解决办法就是使用Handler(处理消息机制).

(3)子线程一定不能更新UI?是错的, SurfaceView :多媒体视频播放 ,可以在子线程中更新UI;Progress(进度)相关的控件:也是可以在子线程中更新Ui;

审计机制:activity完全显示的时候审计机制才会去检测子线程有没有更新Ui. 当activity没有完全显示的时候子线程可以更新UI

******消息机制原理*****

Handler、Looper、MessageQuene之间的关系。

每一个线程最多有一个Looper、一个Looper里边含有一个MessageQuene。

Handler每次将消息发送到MessageQuene中,Looper用过一个死循环不断的从MessageQuene中获取消息,获取后,根据Message的target分发给对应的Handler进行处理。

Handler:消息机制的写法(重要) 

使用Handler的步骤:

1.主线程中创建一个Handler

private Handler handler = new Handler(){
    //重写handler的handlermessage方法
public void handleMessage(android.os.Message msg) {
};
};

2.重写handler的handlermessage方法

3.子线程中创建一个Message对象,将获取的数据绑定给msg

Message msg = new Message();
//另一种方式:Message msg = Messge.obtain;
msg.obj = result;

4.handler对象在子线程中将message发送给主线程

handler.sendMessage(msg);

5. 主线程中handlermessage重写的方法中 接受子线程发来的数据,就可以做更新UI的操作。

 String result= (String) msg.obj;

下面是一个例子:

布局文件

<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.example.yb.myapplication.HttpUrlActivity"> <EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/ed_url"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt_httpRequest"
android:text="请求网页数据"/>
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_httpResponse"/>
</ScrollView>
</LinearLayout>

在Activity里面

public class HttpUrlActivity extends AppCompatActivity implements View.OnClickListener {
private Context mcontext;
private TextView tv_httpResponse1;
private EditText ed_url; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_http_url); mcontext=this;
Button bt_httpRequest = (Button)findViewById(R.id.bt_httpRequest);
ed_url = (EditText) findViewById(R.id.ed_url);
tv_httpResponse1 = (TextView) findViewById(R.id.tv_httpResponse);
bt_httpRequest.setOnClickListener(this);
} //H.1在主线程中创建一个handler对象 ,这里是匿名内部类
Handler handler=new Handler(){
//H.2重新handleMessage方法
@Override
public void handleMessage(Message msg) {
//H.5 接受子线程发来的 数据,处理数据
String result= (String) msg.obj;
//H.6当前线程是主线程,可以做UI的更新
//5显示到TextView
tv_httpResponse1.setText(result);
}
}; @Override
public void onClick(View v) { final String url_str = ed_url.getText().toString().trim();
if (TextUtils.isEmpty(url_str)) {
Toast.makeText(mcontext, "url不能为空", Toast.LENGTH_SHORT).show();
return;
}
//匿名内部类可以用于接口上,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现。
// 最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。
//创建一个子线程做网络请求
new Thread(new Runnable() {
@Override
public void run() {
try {
//四.请求url地址
//1创建一个url对象
URL url = new URL(url_str); //2获取一个urlConnection对象
HttpURLConnection con = (HttpURLConnection) url.openConnection(); //3设置urlConnection的参数:请求时间,请求方式
con.setRequestMethod("GET");
con.setConnectTimeout( * ); //超时时间 //4根据请求的结果的响应码来判断,200成功,206部分数据访问成功。400错误,500服务器异常
int code = con.getResponseCode();
if (code == ) {
//获取数据,并返回的流数据解析为String
InputStream inputStream = con.getInputStream(); //将获取的读取流解析为String字符串
String result=StreamUtil.stremToString(inputStream); //H.3 子线程创建一个Message对象,为了携带子线程获取的数据给主线程
Message msg=new Message();
msg.obj=result;
//H.4使用handler对象将消息发送给主线程
handler.sendMessage(msg); } } catch (Exception e) {
e.printStackTrace();
}
}
}).start(); } }

创建一个工具类StreamUtil ,里面写入把读取流转为String返回

public class StreamUtil {
/**
* 获取的读取流转为String返回
*
* @param inputStream
*/
public static String stremToString(InputStream in) {
String result="";
try {
//创建一个字节数组写入流
ByteArrayOutputStream out=new ByteArrayOutputStream(); byte[] buffer=new byte[];
int length=;
while((length=in.read(buffer))!=-){ //如果返回-1 则表示数据读取完成了。
out.write(buffer,,length);//写入数据
out.flush();
}
result=out.toString();//写入流转为字符串
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}

其他的消息处理:

使用handler直接post到主线程,handler需要在主线程创建

//延迟多少毫米执行runnable。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
tv_simple.setText("我被更新了");
}
}, *);

应用场景:广告展示后,做页面跳转。

android之Handler机制的更多相关文章

  1. Android的Handler机制

    Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...

  2. 10分钟了解Android的Handler机制

    Handler机制是Android中相当经典的异步消息机制,在Android发展的历史长河中扮演着很重要的角色,无论是我们直接面对的应用层还是FrameWork层,使用的场景还是相当的多.分析源码一探 ...

  3. android之handler机制深入解析

    一.android中需要另开线程处理耗时.网络的任务,但是有必须要在UI线程中修改组件.这样做是为了: ①只能在UI线程中修改组件,避免了多线程造成组件显示混乱 ②不使用加锁策略是为了提高性能,因为a ...

  4. 【转载】Android 的 Handler 机制实现原理分析

    handler在安卓开发中是必须掌握的技术,但是很多人都是停留在使用阶段.使用起来很简单,就两个步骤,在主线程重写handler的handleMessage( )方法,在工作线程发送消息.但是,有没有 ...

  5. [转]Android中handler机制的原理

    Andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange). 1)Loo ...

  6. 涛涛的小马甲 Android之Handler机制

    首先需要了解一个基本的概念ANR:Application not response 即应用程序无响应,也就是俗话说的死机. 出现Anr的原因是: 主线程需要做很多重要的事情,响应点击事件,更新UI如果 ...

  7. Android Handler机制剖析

    android的handler机制是android的线程通信的核心机制 Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃. Android中的实现了 接收消息的& ...

  8. Android多线程通信机制

    掌握Android的多线程通信机制,我们首先应该掌握Android中进程与线程是什么. 1. 进程 在Android中,一个应用程序就是一个独立的进程(应用运行在一个独立的环境中,可以避免其他应用程序 ...

  9. android的消息处理机制——Looper,Handler,Message

    在开始讨论android的消息处理机制前,先来谈谈一些基本相关的术语. 通信的同步(Synchronous):指向客户端发送请求后,必须要在服务端有回应后客户端才继续发送其它的请求,所以这时所有请求将 ...

随机推荐

  1. android学习第一篇 基本概念

    一.   1.  Android 四大組件 Activity , Service  , BroadcastReceiver ,ContentProvider 2.  多個Activity組成棧,當前A ...

  2. 关于java中多态的理解

    java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...

  3. 51node1264(判断线段相交)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264 题意:中文题诶- 思路:对于直线a1a2, b1b2, ...

  4. 利用set排序数组并且去掉重复的数组元素

    public class testList { public static void main(String[] args){ java.util.List<String> ls = ne ...

  5. 给钛度产品的一些建议(Note)

    背景:上一只鼠标坏了,今天299从京东如了一只钛度鼠标,核心用料据说都很高端,设计也不错.但是实际用起来发现了很多码农常识问题和产品建议,遂反馈给钛度客服,并记录于此. 传送门: http://bbs ...

  6. 两种方式testng dataprovider结合csv做测试驱动

    方式一: 第一.读取csv数据源码 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...

  7. Datazen配置

    Datazen是被微软收购的移动端全平台的数据展现解决方案.此篇主要介绍其服务器端的配置过程. 在上一篇的基础安装完成之后,在浏览器敲入如下地址进入系统的控制面板(留意安装的时候配置的是80 web端 ...

  8. IIS与Apache共用80端口

    Windows server 2003服务器上安装有默认 IIS 6和Apache两个服务器,IIS运行的一个.net程序,apache运行php程序,现在想让它们同时都能通过80端口访问,设置起来还 ...

  9. Android-Gallery[使用C# And Java实现]

    运行效果 C#实现 using Android.App; using Android.OS; using Android.Widget; namespace ImageDemo { [Activity ...

  10. TotoiseSVN的基本使用方法

    TotoiseSVN的基本使用方法 在 项目管理实践教程一.工欲善其事,必先利其器[Basic Tools]中,我已经讲解了怎样安装TortoiseSVN.在上面的讲解中已经讲了怎么使用VisualS ...