zoukankan      html  css  js  c++  java
  • Android——多线程之Handler

    Why?

        因为在Android系统中UI操作并不是线程安全的,如果多个线程并发的去操作同一个组件,可能导致线程安全问题。为了解决这一个问题,

      android制定了一条规则:只允许UI线程来修改UI组件的属性等,也就是说必须单线程模型,这样导致如果在UI界面进行一个耗时叫长的数据

      更新等就会形成程序假死现象 也就是ANR异常,如果20秒中没有完成程序就会强制关闭。所以比如另一个线程要修改UI组件的时候,

      就需要借助Handler消息机制了。

    Use Status?  

        1.在新启动的线程中发送给消息

        2.在主线程获取、处理消息

           mainthread

        Handler 的执行过程

        角色描述:
        1) Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue

        2) Handler: 你可以构造Handler对象来与Looper沟通,以便push 新消息到 Message Queue里,或者
          接收Looper从Message Queue 里所送来的消息。

        3)Message Queue(消息队列):是用来存放线程放入的消息。

        4)线程:UI thread 通常就是 main thread,而Android 启动程序时会替它建立一个Message Queue。

          每一个线程里可含有一个 Looper 对象以及一个 Message Queue 数据结构。在你的应用程序里,
          可以定义 Handler 的子类别来接收 Looper 所送出的消息。

               

    Detail?

      Handle发送和处理消息的几个方法:

           1. void  handleMessage( Message  msg):处理消息的方法,该方法通常被重写。

           2.final boolean hasMessage(int  what):检查消息队列中是否包含有what属性为指定值的消息

           3.final boolean hasMessage(int what ,Object object) :检查消息队列中是否包含有what好object属性指定值的消息

           4.sendEmptyMessage(int what):发送空消息

           5.final Boolean send EmptyMessageDelayed(int what ,long delayMillis):指定多少毫秒发送空消息

           6.final  boolean sendMessage(Message msg):立即发送消息

           7.final boolean sendMessageDelayed(Message msg,long delayMillis):多少秒之后发送消息

    Demo:

      

        private static String image_path = "http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg";
        private ImageView imageView_1;
        private Button button_1;
        private Button button_2;
    //Handler定义并重写handleMessage方法
    private Handler handler = new Handler() { @Override public void handleMessage(android.os.Message msg) { if (msg.what == 1) { System.out.println(">>>>>STEP2"); byte[] data = (byte[]) msg.obj; Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length); imageView_1.setImageBitmap(bmp); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_choose); button_1 = (Button) findViewById(R.id.Yes); imageView_1 = (ImageView) findViewById(R.id.imageView); button_1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(image_path); HttpResponse httpResponse = null; try{ Thread.sleep(10000); httpResponse = httpClient.execute(httpGet); byte[] data = EntityUtils.toByteArray(httpResponse.getEntity());
    //定义Message,并把Message传给Handler Message msg
    = Message.obtain(); msg.what=1; msg.obj=data; System.out.println(">>>>>STEP1"); handler.sendMessage(msg); } catch(Exception e){ e.printStackTrace(); } } }).start(); } }); }

     效果:

                            

    参考博客: http://blog.csdn.net/x605940745/article/details/13001279

                  http://www.cnblogs.com/youxilua/archive/2011/11/25/2263825.html

  • 相关阅读:
    GitHub 和 Gitee 开源免费 10 个超赞后台管理面板,看完惊呆了!
    LeetCode234.回文链表
    LeetCode104.二叉树的最大深度
    LeetCode142.环形链表II(链表中环的入口节点)
    云原生动态周刊:你订阅 GitHub README 播客了吗?
    云原生爱好者周刊:Crossplane 成为 CNCF 孵化项目
    凌晨 12 点突发 istio 生产事故!一顿操作猛如虎解决了
    新东方在有状态服务 In K8s 的实践
    面向无人驾驶 “云端大脑” 可用性的云原生实践
    Qunar 云原生容器化落地实践
  • 原文地址:https://www.cnblogs.com/udld/p/4313973.html
Copyright © 2011-2022 走看看