博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[android] android消息机制入门
阅读量:6577 次
发布时间:2019-06-24

本文共 3877 字,大约阅读时间需要 12 分钟。

上一节,先把访问网络的部分放到一个子线程里面去执行,new Thread(){}.start()new Thread直接使用匿名内部类来实现,重写run()方法,内部类访问外部的变量,这个变量应该定义成final的。

直接运行会报错,Only the original thread that created can touch xxxxx,只有主线程才可以访问View对象,是因为线程的同步与互斥

内部实现更新界面的时候做了一个检查,检查这个更新的操作是否是在Ui线程里面执行的,如果是没有任何问题,如果不是抛出一个运行时异常,CalledFromWrongThreadException

 

在上一节,我们在子线程里面访问网络之后,直接调用ImageView对象的setImageBitmap()修改Ui界面了,所以会报错

 

我们需要,在子线程里面告诉主线程一个消息,我们要修改界面,把内容Bitmap传递给主线程,让他帮我们修改。

 

子线程通过Handle发送一条消息,消息被放到消息队列里面,

主线程里有一个Looper消息的轮询器

如果轮询器发现了新的消息,调用Handle对象的handleMessage()来处理消息

 

Handler是一个消息处理器必须在主线程里面new出来

 

在主线程的成员属性里面定义Handler,直接new Handler匿名内部重写他的handleMessage()方法

子线程里面,调用Handler对象的sendMessage(msg)方法,把消息放入消息队列,参数:msgMessage对象,new出来Message对象,设置Message对象的what属性=一个自定义的int常量,设置Message对象的obj属性=要传递的内容。

 

在主线程handlerMessage的重写方法内部,会得到这个Message对象,对what属性进行判断,调用ImageView对象的setImageBitmap()方法,把Message对象的obj属性放进去。

 

package com.tsh.internetpic;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.TextUtils;import android.view.View;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;public class MainActivity extends Activity {    protected static final int CHANGE_UI = 0;    protected static final int ERROR = 1;    private EditText et_path;    private ImageView iv_pic;    // 主线程里面定义消息处理器    public Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            if(msg.what==CHANGE_UI){                //更改ui                Bitmap bm=(Bitmap) msg.obj;                iv_pic.setImageBitmap(bm);            }else if(msg.what==ERROR){                String showMsg=(String) msg.obj;                Toast.makeText(MainActivity.this, showMsg, 0).show();            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et_path = (EditText) findViewById(R.id.et_path);        iv_pic = (ImageView) findViewById(R.id.iv_pic);    }    //点击    public void getInternetImg(View v) {        final String path = et_path.getText().toString().trim();        if (TextUtils.isEmpty(path)) {            Toast.makeText(this, "图片路径不能为空", 0).show();        } else {            // 开一个子线程            new Thread() {                @Override                public void run() {                    try {                        URL url = new URL(path);                        HttpURLConnection conn = (HttpURLConnection) url                                .openConnection();                        conn.setRequestMethod("GET");                        conn.setConnectTimeout(5000);                        conn.setRequestProperty("User-Agent", "");                        int code = conn.getResponseCode();                        if (code == 200) {                            InputStream is = conn.getInputStream();                            Bitmap bp = BitmapFactory.decodeStream(is);                            //发送消息                            Message msg = new Message();                            msg.what = CHANGE_UI;                            msg.obj = bp;                            handler.sendMessage(msg);                                                    } else {                            Message msg = new Message();                            msg.what = ERROR;                            msg.obj = "网络连接错误";                            handler.sendMessage(msg);                            // Toast.makeText(this, "网络连接超时", 0).show();                        }                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }.start();        }    }}

 

 

转载地址:http://dlyno.baihongyu.com/

你可能感兴趣的文章
Bootstrap表单
查看>>
oc63--协议@protocol1
查看>>
jYD框架使用
查看>>
python keras 神经网络框架 的使用以及实例
查看>>
GAN网络
查看>>
nagios客户端安装与配置windows篇
查看>>
如何定制 Calico 的 IP 池?- 每天5分钟玩转 Docker 容器技术(71)
查看>>
phpMyadmin各版本漏洞
查看>>
JAVA-JSP内置对象之session范围
查看>>
python生成随机日期字符串
查看>>
P1578 奶牛浴场
查看>>
【经验分享(续篇)】Trachtenberg system(特拉亨伯格速算系统)
查看>>
vivado2013.4和modelsim联合仿真
查看>>
否定之否定与方法论
查看>>
重构——改善既有代码的设计
查看>>
自己没有记住的一点小知识(ORM查询相关)
查看>>
Nchan nginx 支持的开源消息推送模块
查看>>
php模式设计之 观察者模式
查看>>
SharePonit online 列表表单定制
查看>>
DotNetCore跨平台~聊聊中间件
查看>>