<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      如何使用Handler

      什么是Handler?

      Handler可以發(fā)送和處理消息對(duì)象或Runnable對(duì)象,這些消息對(duì)象和Runnable對(duì)象與一個(gè)線程相關(guān)聯(lián)。每個(gè)Handler的實(shí)例都關(guān)聯(lián)了一個(gè)線程和線程的消息隊(duì)列。當(dāng)創(chuàng)建了一個(gè)Handler對(duì)象時(shí),一個(gè)線程或消息隊(duì)列同時(shí)也被創(chuàng)建,該Handler對(duì)象將發(fā)送和處理這些消息或Runnable對(duì)象。

      handler類有兩種主要用途:

      • 執(zhí)行Runnable對(duì)象,還可以設(shè)置延遲。
      • 兩個(gè)線程之間發(fā)送消息,主要用來(lái)給主線程發(fā)送消息更新UI。

      為什么要用Handler

      解決多線程并發(fā)問(wèn)題,假設(shè)如果在一個(gè)activity中,有多個(gè)線程去更新ui,并且都沒(méi)有加鎖機(jī)制,那界面顯示肯定會(huì)不正常。于是andoird官方就封裝了一套更新ui的機(jī)制,也可以用handler來(lái)實(shí)現(xiàn)多個(gè)線程之間的消息發(fā)送。

      如何使用Handler

      handler常用的方法有以下這些:

      post(Runnable)
      postAtTime(Runnable,long)
      postDelayed(Runnable,long)
      sendEmptyMessage(int)
      sendMessage(Message)
      sendMessageAtTime(Message,long)
      sendMessageDelayed(Message,long)
      

      我們可以看到這些方法主要分為兩類,一種是傳入一個(gè)Runnable對(duì)象,一種是傳入一個(gè)Message對(duì)象。

      用代碼來(lái)學(xué)習(xí)post一個(gè)Runnable對(duì)象

      先創(chuàng)建Handler對(duì)象,直接new一個(gè)就行

      private Handler handler=new Handler();
      

      實(shí)現(xiàn)Runnable接口,用匿名實(shí)現(xiàn)方式,重寫run方法,就打印一個(gè)字符串。

      private Runnable runnable=new Runnable() {
              @Override
              public void run() {
                  Log.i("MainActivity","Handler Runnable");
              }
      };
      

      然后我們調(diào)用handler的post方法,這里需要注意的是,post一個(gè)Runnable對(duì)象,底層用的是回調(diào),不會(huì)開啟一個(gè)新的線程,所有Runnable的run方法還是在主線程里面。是可以更新UI的。

      handler.post(runnable);//執(zhí)行
      handler.postDelayed(runnable,2000);//延遲2秒后執(zhí)行
      

      運(yùn)行程序,控制臺(tái)打印的log如下:

      05-18 19:17:14.901 17750-17750/com.ansen.handler I/MainActivity: Handler Runnable
      05-18 19:17:16.901 17750-17750/com.ansen.handler I/MainActivity: Handler Runnable
      

      從上面的log我們可以看到兩條Log的時(shí)間相差兩秒。這是因?yàn)槲覀冇胮ostDelayed方法的時(shí)候第二個(gè)參數(shù)設(shè)置了兩秒的延遲。

      使用sendMessage方法傳遞消息

      從方法的名字上我們可以理解用來(lái)發(fā)送消息,這個(gè)方法在android中使用頻率比較高,因?yàn)樵贏ndroid中多線程中是不能更新UI的,必須要通過(guò)Handler把消息傳遞給UI線程,才能更新UI。當(dāng)然也可以用Handler來(lái)兩個(gè)子線程發(fā)送消息。

      我們給activity_main文件中TextView控件設(shè)置一個(gè)id,然后在MainActivity中查找這個(gè)控件,在多線程的for循環(huán)中給TextView賦值。增加后的代碼如下:

      textview= (TextView) findViewById(R.id.textview);
      new Thread(new Runnable(){
          @Override
          public void run(){
              for(int i=1;i<=100;i++){
                  Log.i("MainActivity","當(dāng)前值是:"+i);
                  textview.setText("當(dāng)前值是:"+i);
                  try {
                      Thread.sleep(200);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
          }
      }).start();
      

      重新運(yùn)行代碼,程序奔潰。控制臺(tái)打印如下log:

      android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
      at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6024)
      at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:820)
      

      這是因?yàn)樵赼ndroid中不能在多線程中更新UI造成的。

      每個(gè)應(yīng)用啟動(dòng)的時(shí)候,Android會(huì)啟動(dòng)一個(gè)對(duì)應(yīng)的主線程用來(lái)處理UI相關(guān)的事情,例如用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,并把相關(guān)的事件分發(fā)到對(duì)應(yīng)的組件進(jìn)行處理,所以主線程通常又被叫做UI線程。

      這個(gè)時(shí)候我們就會(huì)用到Android的Handle類,Handle可以幫我們解決多線程不能更新UI問(wèn)題,這里我們只要知道使用這個(gè)類就行,在后面我們會(huì)詳細(xì)介紹它的原理。

      接下來(lái)我們看如何用handler在主線程中接受子線程的消息,并且更新UI。首先new一個(gè)Handler的時(shí)候?qū)崿F(xiàn)他的handleMessage方法,修改后的代碼如下:

      private Handler handler=new Handler(){
          @Override
          public void handleMessage(Message msg) {
              if(msg.what==UPDATE_UI){
                  textview.setText("當(dāng)前值是:"+msg.obj);
              }
          }
      };
      

      我們可以看到把更新TextView的代碼放到這里來(lái)了,并且用到handleMessage的msg參數(shù)。這個(gè)對(duì)象我們常用的一般就兩個(gè)屬性,what就是一個(gè)標(biāo)示,我們發(fā)送消息的時(shí)候必需要指定值。obj:發(fā)送消息的參數(shù)。

      再來(lái)看看多線程的run方法做了哪些改動(dòng),首先調(diào)用obtainMessage方法,這個(gè)方法呢是從消息池里面返回一個(gè)Message對(duì)象,如果消息池沒(méi)有才會(huì)創(chuàng)建對(duì)象,這樣避免一直去new Message對(duì)象。message對(duì)象有what屬性是必需要賦值的,是一個(gè)int類型。前面我們講到過(guò)了,是一個(gè)標(biāo)示。obj是發(fā)送消息用來(lái)傳參,這里我們傳入的是i的值。最后調(diào)用handler.sendMessage(message)方法。然后我們handler的handleMessage方法就會(huì)回調(diào)。

      new Thread(new Runnable(){
                  @Override
                  public void run(){
                      for(int i=1;i<=100;i++){
                          Log.i("MainActivity","當(dāng)前值是:"+i);
                          Message message=handler.obtainMessage();
                          message.what=UPDATE_UI;
                          message.obj=i;
                          handler.sendMessage(message);
                          try {
                              Thread.sleep(200);
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                      }
                  }
      }).start();
      

      還有sendEmptyMessage跟sendMessageDelayed方法我就不一一給大家解釋了,有興趣的朋友自己去實(shí)現(xiàn)一下。

      源碼下載

      handler

      如果你想第一時(shí)間看我的后期文章,掃碼關(guān)注公眾號(hào),每周不定期推送Android開發(fā)實(shí)戰(zhàn)教程文章...

            Android開發(fā)666 - 安卓開發(fā)技術(shù)分享
                   掃描二維碼加關(guān)注
      

      Android開發(fā)666

      posted @ 2017-05-18 20:30  安輝  閱讀(1498)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 蜜臀98精品国产免费观看| 51妺嘿嘿午夜福利| 九色综合久99久久精品| 久久久午夜精品福利内容| 国产一区二区三区黄色大片| yw尤物av无码国产在线观看| 久久亚洲精品情侣| 亚洲成aⅴ人在线电影| 午夜夫妻试看120国产| 成人啪精品视频网站午夜| 国产精品扒开腿做爽爽爽a片唱戏| 日韩中文字幕一二三视频| 久久一日本道色综合久久| 在线观看精品日本一区二| 97久久综合亚洲色hezyo| 亚洲一区二区三区18禁| 国产精品一亚洲av日韩| 成人网站免费观看永久视频下载| 国产在线精品一区二区三区| 国产av一区二区久久蜜臀| 国产情侣激情在线对白| 免费大片av手机看片高清| 国产无遮挡猛进猛出免费| 巨胸美乳无码人妻视频漫画| 黄网站色视频免费观看| 丰满熟妇乱又伦在线无码视频| 中文字幕亚洲人妻系列| 仁怀市| 四虎精品视频永久免费| 国产高清在线男人的天堂| 久久精品国产蜜臀av| 久久久久久综合网天天| av午夜福利一片免费看久久| 成人拍拍拍无遮挡免费视频| 国产乱码精品一区二区三上 | 国产老妇伦国产熟女老妇高清 | 国产目拍亚洲精品二区| 午夜福利在线观看6080| 成人国产精品中文字幕| 亚洲综合久久精品哦夜夜嗨| 欧美日韩人人模人人爽人人喊|