Android——多線程之Handler

來源:互聯網
上載者:User

標籤:

Why?

    因為在Android系統中UI操作並不是安全執行緒的,如果多個線程並發的去操作同一個組件,可能導致安全執行緒問題。為瞭解決這一個問題,

  android制定了一條規則:只允許UI線程來修改UI組件的屬性等,也就是說必須單執行緒模式,這樣導致如果在UI介面進行一個耗時叫長的資料

  更新等就會形成程式假死現象 也就是ANR異常,如果20秒中沒有完成程式就會強制關閉。所以比如另一個線程要修改UI組件的時候,

  就需要藉助Handler訊息機制了。

 

Use Status?  

    1.在新啟動的線程中發送給訊息

    2.在主線程擷取、處理訊息

       

 

    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

 

Android——多線程之Handler

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.