Handler

1:handler
 1:Handler對象在哪一個線程中建立的,那麼Handler就屬於哪個線程。
 2:sendMessage方法哪個Handler調用,就這個handler來處理消息。
  處理消息。
  1;handleMessage方法進行處理.建立Handler對象的時候進行重寫。
  2:post方法,傳一個Runnable對象給post方法,那麼Runnable的run方法就執行在調用post方法的handler對象所在的線程.
  sendMessage,sendEmptyMessage,sendMessageAtTime底層都是調用sendMessageAtTime這個方法。
2:Ui線程跟work線程之間互相發送數據。
 1:若是Handler在工做線程中建立,必須先調用Looper.prepare().建立完Handler對象後,調用Looper.loop().
 (在ActivityThread類,底層已經幫咱們已經調用以上的方法。)
3:Handler,Message的機制.
 Looper.prepare()----建立Looper對象,去管理Messagequeue..
 sendMessageAtTime()-----發消息----enqueueMessage()(將當前的handler對象設置給Message的target對象)---將消息放到Messagequeue裏。
 Looper.loop--有一個死循環,不斷得從Messagequeue裏取出消息---Message對象(msg)。------調用msg.target的dispatchMessage方法。------dispatchMessage方法裏調用handler對象的handleMessage方法。ide

相關概念oop

Message Queue(消息隊列):用來存放經過Handler發佈的消息,一般附屬於某一個建立它的線程,能夠經過Looper.myQueue()獲得當前線程的消息隊列
Handler:能夠發佈或者處理一個消息或者操做一個Runnable,經過Handler發佈消息,消息將只會發送到與它關聯的消息隊列,然也只能處理該消息隊列中的消息
Looper:是Handler和消息隊列之間通信橋樑,程序組件首先經過Handler把消息傳遞給Looper,Looper把消息放入隊列。Looper也把消息隊列裏的消息廣播給全部的Handler,Handler接受到消息後調用handleMessage進行處理
Message:消息的類型,在Handler類中的handleMessage方法中獲得單個的消息進行處理post

 

* 下載圖片ui

private ImageView image_main; private Handler handler =new Handler() { @Override public void handleMessage(Message msg) { //處理其餘線程傳遞過來的消息。
           Bitmap bitmap = (Bitmap) msg.obj; image_main.setImageBitmap(bitmap); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image_main = (ImageView) findViewById(R.id.image_main); //開啓一個線程下載圖片。
 startThead(); } private void startThead() { new Thread(new Runnable() { @Override public void run() { //執行在工做線程中。
                String path = "http://img4.duitang.com/uploads/item/201306/20/20130620221932_FVnZK.thumb.600_0.jpeg"; try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.connect(); ; int code = conn.getResponseCode(); if (code == 200) { InputStream is = conn.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(is); //將圖片設置給ImageView. //發送消息
                        Message msg = new Message(); //arg1,arg2--放的都是整數。 what---類型。也是整數。obj---放的是任意的對象
                        msg.obj = bitmap; handler.sendMessage(msg);//發送消息。
 } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); }
public class MainActivity extends AppCompatActivity { private ImageView image_main; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image_main = (ImageView) findViewById(R.id.image_main); //開啓一個線程下載圖片。
 startThead(); } private void startThead() { new Thread(new Runnable() { @Override public void run() { //執行在工做線程中。
                String path = "http://img4.duitang.com/uploads/item/201306/20/20130620221932_FVnZK.thumb.600_0.jpeg"; try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.connect(); ; int code = conn.getResponseCode(); if (code == 200) { InputStream is = conn.getInputStream(); final Bitmap bitmap = BitmapFactory.decodeStream(is); //顯示圖片。
                        handler.post(new Runnable() { @Override public void run() { //工做在ui線程。
                                Log.i("Main",Thread.currentThread()+""); image_main.setImageBitmap(bitmap); } }); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } }

 廣告輪播this

private ViewPager vg_main; private List<ImageView> list; private int[] imags_id = {R.mipmap.a,R.mipmap.b,R.mipmap.c,R.mipmap.d,R.mipmap.e}; int position = 0; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { //定位
        vg_main.setCurrentItem(++position,true); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); vg_main = (ViewPager) findViewById(R.id.viewpager); initList(); MyPagerAdapter adapter = new MyPagerAdapter(); vg_main.setAdapter(adapter); new Thread(new Runnable() { @Override public void run() { //發送消息到主線程。
            while(true) { handler.sendEmptyMessage(1); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } private void initList() { list = new ArrayList<ImageView>(); for(int i=0;i<imags_id.length;i++){ ImageView img = new ImageView(this); img.setImageResource(imags_id[i]); list.add(img); } } class MyPagerAdapter extends PagerAdapter{ @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(list.get(position%list.size())); return list.get(position%list.size()); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(list.get(position%list.size())); } }

UI線程和工做線程互相傳遞url

public class MainActivity extends AppCompatActivity { private TextView tv_msg; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { String str = (String) msg.obj; tv_msg.setText(str); } }; private Handler handler2 = new Handler(){ @Override public void handleMessage(Message msg) { String str = (String) msg.obj; tv_msg.setText(str); Log.i("Main",str); } }; private Handler handler_work; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_msg = (TextView) findViewById(R.id.tv_message); Button btn = null; } public void click(View view){ switch (view.getId()){ case R.id.btn_main: //Ui線程向工做線程發送數據。
                Message msg = handler_work.obtainMessage(); msg.obj = "我是main線程發送過來的消息"; handler_work.sendMessage(msg); break; case R.id.btn_workThread: new Thread(new Runnable() { @Override public void run() { Message msg = handler.obtainMessage(); msg.obj = "我是工做線程發送過來的消息"; handler.sendMessage(msg); Message msg2 = handler2.obtainMessage(); msg2.obj = "我是工做線程發送過來的消息----2"; handler2.sendMessage(msg2); //建立handler
 Looper.prepare(); handler_work = new Handler(){ @Override public void handleMessage(Message msg) { String text = (String) msg.obj; Log.i("work",text); } }; Looper.loop();//循環得取出消息。
 } }).start(); break; } } }

倒計時spa

private Button btn_start; private TextView tv_time,tv_stop; private int total = 10; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { //設置
        int timer = msg.arg1; tv_time.setText(msg.arg1 + ""); if(timer==0){ btn_start.setEnabled(true); tv_stop.setVisibility(View.VISIBLE); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { btn_start = (Button) findViewById(R.id.btn_start); tv_time = (TextView) findViewById(R.id.tv_time); tv_stop = (TextView) findViewById(R.id.tv_stop); } public void click(View view){ //按鈕再也不可用。
    btn_start.setEnabled(false); tv_stop.setVisibility(View.INVISIBLE); //改變tv_time時間。
    new Thread(new Runnable() { @Override public void run() { int total = 10; //立刻設置。
            Message msg = handler.obtainMessage(); msg.arg1 = total; handler.sendMessage(msg); for(int i=9;i>=0;i--){ Message msg2 = handler.obtainMessage(); msg2.arg1 = i; handler.sendMessage(msg2); Log.i("Main",msg2.arg1+""); // 睡眠。

                try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); }
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息