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

  • 相关阅读:
    Go 语言简介(下)— 特性
    Array.length vs Array.prototype.length
    【转】javascript Object使用Array的方法
    【转】大话程序猿眼里的高并发架构
    【转】The magic behind array length property
    【转】Build Your own Simplified AngularJS in 200 Lines of JavaScript
    【转】在 2016 年做 PHP 开发是一种什么样的体验?(一)
    【转】大话程序猿眼里的高并发
    php通过token验证表单重复提交
    windows 杀进程软件
  • 原文地址:https://www.cnblogs.com/udld/p/4313973.html
Copyright © 2011-2022 走看看