Android——使用Handle和Message更新UI控件

原创 2015年11月20日 19:20:34

最近在写一个使用Android端访问PCweb服务端的测试应用,需要在进行网络通信,而android网络通信需要异步执行,一开始是直接用AsyncTask的方法在MainActivity中写代码,一切正常,通过AsyncTask 的onPostExecute方法进行界面更新,但为了代码的可复用,采用将网络通信放到另外一个HttpUtils.java类中作为静态方法调用。此时出了一些问题:
1.不知道怎么将web端的输出结果返回给主线程的变量
2.在HttpUtils.java中声明静态字段,将结果先递给静态字段。但是在主线程中去这个字段时往往不是及时的。

所以在百度了一下之后,找到一种很普遍的方法:用handle 来处理异步线程的执行情况
具体流程:
1.在主线程中声明一个Handle(android.os),他有可以覆盖的一个方法handleMessage(Message msg)用于监听收到消息的事件,在这个方法里面可以进行UI的一些控件更新。
2.在异步方法执行的过程中,如果想要返回一些参数给主线程,那么通过发送一个Message的方式,传回参数,可以包含当前消息包含的类型,例如代表当前的消息是查询操作发出的。
3.在主线程中的Handle的handleMessage()中判断异步方法中是什么方法发出的消息。然后进行相关的操作

下面开始一个简单的例子
例如:我要进行一次http网络请求,请求结果放在StringBuilder中,要先新建一个线程去运行网络请求,在得到请求返回的数据后,将他包装到message中,再利用handle的send方法返回到UI线程中执行

在包类的其他java文件中写一个方法,这里我新建了一个HttpUtils.java类,里面的一些queryURL是自己本地搭的Apache服务器的PHP访问地址,用于对MySQL数据库进行相关操作.

package com.sky.firsthttpapp;

import android.os.Bundle;
import android.os.Message;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by Administrator on 2015/11/20.
 */
public class HttpUtils
{
    public static String queryURL="/DataApplication/readData.php"
    ,deleteURL ="/DataApplication/deleteData.php?id="
    ,updateURL="/DataApplication/updataData.php?"
    ,insertURL="/DataApplication/addData.php?";
    public static URL creatURL(String urlStr,String Ip,String params){
        URL url=null;
        try{
            url=new URL("http://"+Ip+urlStr+params);
        } catch (MalformedURLException e) {
            Message msg=new Message();
            Bundle b=new Bundle();
            b.putString("type","exception");
            b.putString("result","URL_Exception:"+e.getMessage());
            msg.setData(b);
            MainActivity.handler.sendMessage(msg);
        }
        return url;
    }
    public static void query(String Ip){
        final URL url=creatURL(queryURL,Ip,"");
        new Thread(){
            public void run(){
                StringBuilder result=new StringBuilder();
                try {
                    URLConnection connection=url.openConnection();
                    BufferedReader br=new BufferedReader(
                            new InputStreamReader(
                                    connection.getInputStream()));
                    String str="";
                    while((str=br.readLine())!=null){
                        result.append(str);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //发送消息给UI线程的handle,消息里面包含结果,和消息type,
                Bundle b=new Bundle();
                b.putString("type","query");
                b.putString("result",result.toString());
                Message msg=new Message();
                msg.setData(b);
                MainActivity.handler.sendMessage(msg);
            }
        }.start();
    }
}

在MainActivity中,也就是在UI线程中,定义了一个静态的Handle handle

public static  Handler handler;

在onCreate中初始化并重写handleMessage方法

 handler=new Handler(){
 //这是默认的方法
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
            }
        };

在上面已经在HttpUtils的query方法中调用了handle.sendMessage().它会调用UI线程里handle的handleMessage()方法

所以在handleMessage()中可以这样处理:取得msg中的数据,分析type和result。

 @Override
            public void handleMessage(Message msg) {
                Bundle b = msg.getData();
                String type = b.getString("type");
                String result = b.getString("result");
                if(type=="query"){
                    Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
                }
            }

如果类型是query,代表是HttpUtils中的query()方法调用,用Toast显示结果,

这里想要简单测试直接把URL改为“Http://www.baidu.com“即可
这里写图片描述

Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自【张鸿洋的博客】很多人面试肯定都被问到过,请问Andro...

Android Handler Message总结

当应用程序启动时,会开启一个主线程(也就是UI线程),由她来管理UI,监听用户点击,来响应用户并分发事件等。所以一般在主线程中不要执行比较耗时的操作,如联网下载数据等,否则出现ANR错误。所以就将这些...

handler 使用 重写 handleMessage 消息队列

private TextView textView1;       public static int add;       private Handler handerHandler = n...

技术记录---Handle收不到消息的问题分析

Hanlder发送完消息后,不能收到消息的问题分析。
  • ilygjl
  • ilygjl
  • 2016年04月12日 21:31
  • 2762

Android的Message机制(简单小结)

网上以文档形式流传,不知道原文在哪,感谢原作者了! ================简单调整了下格式就共享了===========================================...
  • dadoneo
  • dadoneo
  • 2012年06月15日 21:45
  • 96507

Android中使用Handler机制更新UI的三种解决方案

最近想把学习Android过程中的Handler使用经验写下来,供自己以后查看,也与大家一起分享。        使用Handler其实不得不与Android中的线程或者说Java中的多线程扯上关系。...

Android初级开发----用Handle机制更新UI界面

引入: 之前对Android讲义的一个小项目——–随指尖移动的小球进行修改,利用View中的invalidate()方法实现每次触碰屏幕更新(UI线程)小球的位置并且附加判断大小,实现触碰更新小球大...

Handler更新UI的几种方式

Handler、loop、MessageQueue的工作原理 Message:Handler接收和处理的消息对象 Looper:每个线程只能拥有一个looper.它的loop方法负责读取Me...

Android 中handlemessage方法获取数据赋值全局变量

new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated met...

android handler 消息更新UI的大致过程

android handler 消息更新UI的大致过程,主要是通过以下两种方式来传递数据,一种是设置全局变量,另外一种是通过消息msg.obj自己携带数据传递给指定消息来接收处理。  一。    需要...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android——使用Handle和Message更新UI控件
举报原因:
原因补充:

(最多只允许输入30个字)