日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android中的Handler的具体用法

發(fā)布時(shí)間:2023/12/20 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中的Handler的具体用法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android UI操作并不是線(xiàn)程安全的并且這些操作必須在UI線(xiàn)程中執(zhí)行。Android利用Handler來(lái)實(shí)現(xiàn)UI線(xiàn)程的更新的。

Handler是Android中的消息發(fā)送器,其在哪個(gè)Activity中創(chuàng)建就屬于且緊緊屬于該Activity。還可以說(shuō)其在哪個(gè)線(xiàn)程中new的,就是那個(gè)線(xiàn)程的Handler。

Handler的定義: 主要接受子線(xiàn)程發(fā)送的數(shù)據(jù), 并用此數(shù)據(jù)配合主線(xiàn)程更新UI.?

解釋: 當(dāng)應(yīng)用程序啟動(dòng)時(shí),Android首先會(huì)開(kāi)啟一個(gè)主線(xiàn)程 (也就是UI線(xiàn)程) , 主線(xiàn)程為管理界面中的UI控件,進(jìn)行事件分發(fā), 比如說(shuō), 你要是點(diǎn)擊一個(gè) Button ,Android會(huì)分發(fā)事件到Button上,來(lái)響應(yīng)你的操作。 ?如果此時(shí)需要一個(gè)耗時(shí)的操作,例如: 聯(lián)網(wǎng)讀取數(shù)據(jù),或者讀取本地較大的一個(gè)文件的時(shí)候,你不能把這些操作放在主線(xiàn)程中,,如果你放在主線(xiàn)程中的話(huà),界面會(huì)出現(xiàn)假死現(xiàn)象,如果5秒鐘還沒(méi)有完成 的話(huà),會(huì)收到Android系統(tǒng)的一個(gè)錯(cuò)誤提示 "強(qiáng)制關(guān)閉".這個(gè)時(shí)候我們需要把這些耗時(shí)的操作,放在一個(gè)子線(xiàn)程中,因?yàn)樽泳€(xiàn)程涉及到UI更新,Android主線(xiàn)程是線(xiàn)程不安全的,也就是說(shuō),更新 UI只能在主線(xiàn)程中更新,子線(xiàn)程中操作是危險(xiǎn)的. 這個(gè)時(shí)候,Handler就出現(xiàn)了.來(lái)解決這個(gè)復(fù)雜的問(wèn)題,由于Handler運(yùn)行在主線(xiàn)程中(UI線(xiàn)程中), ?它與子線(xiàn)程可以通過(guò)Message對(duì)象來(lái)傳遞數(shù)據(jù), 這個(gè)時(shí)候,Handler就承擔(dān)著接受子線(xiàn)程傳過(guò)來(lái)的(子線(xiàn)程用sedMessage()方法傳弟)Message對(duì)象,(里面包含數(shù)據(jù)),把這些消息放 入主線(xiàn)程隊(duì)列中,配合主線(xiàn)程進(jìn)行更新UI。

Handler一些特點(diǎn)?

handler可以分發(fā)Message對(duì)象和Runnable對(duì)象到主線(xiàn)程中, 每個(gè)Handler實(shí)例,都會(huì)綁定到創(chuàng)建他的線(xiàn)程中(一般是位于主線(xiàn)程),?

它有兩個(gè)作用:

(1)安排消息或Runnable 在某個(gè)主線(xiàn)程中某個(gè)地方執(zhí)行

(2)安排一個(gè)動(dòng)作在不同的線(xiàn)程中執(zhí)行?

Handler中分發(fā)消息的一些方法?

post(Runnable)?

postAtTime(Runnable,long)?

postDelayed(Runnable long)?

sendEmptyMessage(int)?

sendMessage(Message)?

sendMessageAtTime(Message,long)?

sendMessageDelayed(Message,long)?

以上post類(lèi)方法允許你排列一個(gè)Runnable對(duì)象到主線(xiàn)程隊(duì)列中,?

sendMessage類(lèi)方法, 允許你安排一個(gè)帶數(shù)據(jù)的Message對(duì)象到隊(duì)列中,等待更新.

?

補(bǔ)充別人總結(jié)的:------------------->

1、向哪個(gè)Handler 發(fā)送消息,就必須在哪個(gè)handler 里面接收;

2、直接使用JAVA 的 Thread 是無(wú)法更新Android UI的,因?yàn)锳ndroid View 在設(shè)計(jì)的時(shí)線(xiàn)程是不完全的,不過(guò)Android 提供了幾種供開(kāi)發(fā)者在線(xiàn)程中更新UI的方法,如下:

runOnUiThread( Runnable )

post( Runnable )

postDelayed( Runnable, long )

3、直接使用hanlder.post 等方法是在當(dāng)前主線(xiàn)程里面做操作,而不是另外新建線(xiàn)程,建議使用Thread 線(xiàn)程直接新建另外一個(gè)線(xiàn)程或者使用HandlerThread類(lèi)也可以。( 這句話(huà)的意思是ui線(xiàn)程是主線(xiàn)程,把一些耗時(shí)的操作放入其他線(xiàn)程做,主線(xiàn)程僅僅更新視圖)

4、記住消息隊(duì)列的先進(jìn)先出原則。?

?

需要注意的:

一. Handler與Thread的區(qū)別。

Handler與調(diào)用者處于同一線(xiàn)程,如果Handler里面 做耗時(shí)的動(dòng)作,調(diào)用者線(xiàn)程會(huì)阻塞。Android UI操作不是線(xiàn)程安全的,并且這些操作必須在UI線(xiàn)程中執(zhí)行。Android提供了幾種基本的可以在其他線(xiàn)程中處理UI操作的方案,包括Activity 的runOnUiThread(Runnable),View的post以及1.5版本的工具類(lèi)AsyncTask等方案都采用了 Handler,Handler的post對(duì)線(xiàn)程的處理也不是真正start一個(gè)新的線(xiàn)程,而是直接調(diào)用了線(xiàn)程的run方法,這正是google煞費(fèi)苦心 搞一套Handler的用意。

?

二. Handler對(duì)于Message的處理不是并發(fā)的。

一個(gè)Looper 只有處理完一條Message才會(huì)讀取下一條,所以消息的處理是阻塞形式的。但是如果用不同的Looper則能達(dá)到并發(fā)的目的。Service 中,onStart的執(zhí)行也是阻塞的。如果一個(gè)startService在onStart執(zhí)行完成之前,再次條用startService也會(huì)阻塞。如果 希望能盡快的執(zhí)行onStart則可以在onStart中使用handler,因?yàn)镸essage的send是非阻塞的。如果要是不同消息的處理也是并發(fā) 的,則可以用不同的Looper實(shí)例化Handler。

?

三.?資源回收

向Handler對(duì)象發(fā)送類(lèi)似new Message ()形式的空Message可以達(dá)到清空Message的目的,這種做法與getLooper().quit()的做法是一樣的。如果利用的資源較多,應(yīng)及時(shí)清理。

--------------------->

?

Handler的post(Runnable r)和postDelayed(Runnable r, long l);

Java代碼?
  • public?class?SimpleHandlerTest?extends?Activity?{??
  • ????private?static?final?String?TAG?=?"SimpleHandlerTest";??
  • ????private?MyView?myView;??
  • ????private?Handler?mHandler;??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????requestWindowFeature(Window.FEATURE_NO_TITLE);??
  • ??
  • ????????myView?=?new?MyView(this);??
  • ????????mHandler?=?new?Handler()?{??
  • ????????????@Override??
  • ????????????public?void?handleMessage(Message?msg)?{??
  • ????????????????super.handleMessage(msg);??
  • ????????????????switch?(msg.what)?{??
  • ????????????????case?1:??
  • ????????????????????myView.invalidate();??
  • ????????????????????break;??
  • ????????????????}??
  • ????????????}??
  • ????????};??
  • ????????/*?
  • ?????????*?添加線(xiàn)程到消息隊(duì)列,如果該Handler被觸發(fā)就會(huì)執(zhí)行其消息隊(duì)列中的線(xiàn)程?
  • ?????????*/??
  • ????????mHandler.post(update);??
  • ????????/*?
  • ?????????*?UI線(xiàn)程是線(xiàn)程不安全的,所以只能在UI線(xiàn)程中修改頁(yè)面的顯示?,在New出來(lái)的線(xiàn)程中不能夠修改UI?
  • ?????????*/??
  • ????????setContentView(myView);??
  • ????}??
  • ??
  • ????private?Runnable?update?=?new?Runnable()?{??
  • ????????@Override??
  • ????????public?void?run()?{??
  • ????????????myView.update();??
  • ????????????mHandler.postDelayed(update,?10);??
  • ????????}??
  • ????};??
  • ??
  • ????class?MyView?extends?View?{??
  • ????????private?float?x?=?0f;??
  • ??
  • ????????public?MyView(Context?context)?{??
  • ????????????super(context);??
  • ????????}??
  • ??
  • ????????public?void?update()?{??
  • ????????????postInvalidate();??
  • ????????}??
  • ??
  • ????????@Override??
  • ????????protected?void?onDraw(Canvas?canvas)?{??
  • ????????????super.onDraw(canvas);??
  • ????????????x++;??
  • ????????????Paint?paint?=?new?Paint();??
  • ????????????paint.setAntiAlias(true);??
  • ????????????paint.setColor(Color.RED);??
  • ????????????canvas.drawRect(x,?40,?x?+?40,?80,?paint);??
  • ????????????canvas.drawCircle(x,?40,?40,?paint);??
  • ????????}??
  • ????}??
  • ??
  • ????@Override??
  • ????public?boolean?onCreateOptionsMenu(Menu?menu)?{??
  • ????????menu.add(1,?1,?1,?"下個(gè)頁(yè)面");??
  • ????????return?super.onCreateOptionsMenu(menu);??
  • ????}??
  • ??
  • ????@Override??
  • ????public?boolean?onMenuItemSelected(int?featureId,?MenuItem?item)?{??
  • ????????if?(item.getItemId()?==?1)?{??
  • ????????????startActivity(new?Intent(this,?Update.class));??
  • ????????}??
  • ????????return?super.onMenuItemSelected(featureId,?item);??
  • ????}??
  • }??
  • ?

    Java代碼
  • public?class?Update?extends?Activity?{??
  • ????public?ProgressDialog?pBar;??
  • ????private?Handler?handler?=?new?Handler();??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.smt);??
  • ????????Dialog?dialog?=?new?AlertDialog.Builder(Update.this).setTitle("系統(tǒng)更新")??
  • ????????????????.setMessage("發(fā)現(xiàn)新版本,請(qǐng)更新!")//?設(shè)置內(nèi)容??
  • ????????????????.setPositiveButton("確定",//?設(shè)置確定按鈕??
  • ????????????????????????new?DialogInterface.OnClickListener()?{??
  • ????????????????????????????@Override??
  • ????????????????????????????public?void?onClick(DialogInterface?dialog,??
  • ????????????????????????????????????int?which)?{??
  • ????????????????????????????????pBar?=?new?ProgressDialog(Update.this);??
  • ????????????????????????????????pBar.setTitle("正在下載");??
  • ????????????????????????????????pBar.setMessage("請(qǐng)稍候...");??
  • ????????????????????????????????pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);??
  • ????????????????????????????????downFile("http://localhost:8080/examples/images/Blockx_3D.apk");??
  • ????????????????????????????}??
  • ????????????????????????}).setNegativeButton("取消",??
  • ????????????????????????new?DialogInterface.OnClickListener()?{??
  • ????????????????????????????public?void?onClick(DialogInterface?dialog,??
  • ????????????????????????????????????int?whichButton)?{??
  • ????????????????????????????????//?點(diǎn)擊"取消"按鈕之后退出程序??
  • ????????????????????????????}??
  • ????????????????????????}).create();//?創(chuàng)建顯示對(duì)話(huà)框??
  • ????????dialog.show();??
  • ????}??
  • ??
  • ????void?downFile(final?String?url)?{??
  • ????????pBar.show();??
  • ????????new?Thread()?{??
  • ????????????public?void?run()?{??
  • ????????????????HttpClient?client?=?new?DefaultHttpClient();??
  • ????????????????//?params[0]代表連接的url??
  • ????????????????HttpGet?get?=?new?HttpGet(url);??
  • ????????????????HttpResponse?response;??
  • ????????????????try?{??
  • ????????????????????response?=?client.execute(get);??
  • ????????????????????HttpEntity?entity?=?response.getEntity();??
  • ????????????????????long?length?=?entity.getContentLength();??
  • ????????????????????InputStream?is?=?entity.getContent();??
  • ????????????????????FileOutputStream?fileOutputStream?=?null;??
  • ????????????????????if?(is?!=?null)?{??
  • ????????????????????????File?file?=?new?File(Environment??
  • ????????????????????????????????.getExternalStorageDirectory(),?"Blockx_3D.apk");??
  • ????????????????????????fileOutputStream?=?new?FileOutputStream(file);??
  • ??
  • ????????????????????????byte[]?buf?=?new?byte[1024];??
  • ????????????????????????int?ch?=?-1;??
  • ????????????????????????int?count?=?0;??
  • ????????????????????????while?((ch?=?is.read(buf))?!=?-1)?{??
  • ????????????????????????????fileOutputStream.write(buf,?0,?ch);??
  • ????????????????????????????count?+=?ch;??
  • ????????????????????????????if?(length?>?0)?{??
  • ????????????????????????????}??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????????fileOutputStream.flush();??
  • ????????????????????if?(fileOutputStream?!=?null)?{??
  • ????????????????????????fileOutputStream.close();??
  • ????????????????????}??
  • ????????????????????down();??
  • ????????????????}?catch?(ClientProtocolException?e)?{??
  • ????????????????????e.printStackTrace();??
  • ????????????????}?catch?(IOException?e)?{??
  • ????????????????????e.printStackTrace();??
  • ????????????????}??
  • ????????????}??
  • ????????}.start();??
  • ????}??
  • ??
  • ????void?down()?{??
  • ????????handler.post(new?Runnable()?{??
  • ????????????public?void?run()?{??
  • ????????????????pBar.cancel();??
  • ????????????????update();??
  • ????????????}??
  • ????????});??
  • ????}??
  • ??
  • ????void?update()?{??
  • ????????Intent?intent?=?new?Intent(Intent.ACTION_VIEW);??
  • ????????intent.setDataAndType(Uri.fromFile(new?File("/sdcard/Blockx_3D.apk")),??
  • ????????????????"application/vnd.android.package-archive");??
  • ????????startActivity(intent);??
  • ????}??
  • }?
  • 轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/3544135.html

    總結(jié)

    以上是生活随笔為你收集整理的Android中的Handler的具体用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。