• [android] android消息机制入门


    上一节,先把访问网络的部分放到一个子线程里面去执行,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();
    
            }
        }
    }

  • 相关阅读:
    解决web服务器乱码问题
    Reporting services 打印
    moss用户管理
    乱弹超级女声。。。。。。。。。。。。
    微软项目管理[EPM]数据库应用举例1: 找到所有正在进行的项目
    ajax中另一种装载数据页面的方法
    微软项目管理[EPM]数据库剖析4:项目大纲代码的四张表
    微软项目管理[EPM]数据库应用举例2: 取得一个项目的某大纲代码的值
    支持多表头、滚动条可排序的DataGrid控件[Free]
    微软项目管理[EPM]数据库剖析3:如何取得某个项目的某个大纲代码的值
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5285661.html
Copyright © 2020-2023  润新知