最近在写代码的时候,突然间碰到loop这个东西,所以上网找了一下文件,看到有一个老兄写的还不错,这里当做笔记一样记下来,也分享给大家看看。
Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行处理,就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。
sendMessageAtTime(Message, long),未来某一时间点发送消息;
sendMessageDelayed(Message, long),延时Nms发送消息。
postDelayed(Runnable, long),提交计划任务延时多少毫秒再执行。
xml文档如下package com.example.handlertest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.widget.TextView; public class MainActivity extends Activity { private static final int REFRESH_UI = 1; private TextView tvShow; private MyThreadHandler myThreadHandler; private UIHandler uiHandler; private HandlerThread handlerThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //创建刷新UI的handler对象 uiHandler = new UIHandler(); //创建handler线程 handlerThread = new HandlerThread("spendtimes"); handlerThread.start(); //获取handler线程的消息队列,用于创建我自己的handler myThreadHandler = new MyThreadHandler(handlerThread.getLooper()); //发送一条空消息启动操作,此时消息被发送至线程中的消息队列 myThreadHandler.sendEmptyMessage(1); } private void initView() { tvShow = (TextView) findViewById(R.id.show_res); } class MyThreadHandler extends Handler{ public MyThreadHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { if(msg.what == 1) { //耗时处理操作 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } StringBuilder sb = new StringBuilder(); sb.append(tvShow.getText().toString()); sb.append(" dealwith thread"); //操作完成以后,调用主线程handler发送刷新消息,此时消息被加入UI线程消息队列,等待被执行 //将处理结果保存到obj对象中,随消息发送出去 Message message = new Message(); message.obj = sb.toString(); message.what = REFRESH_UI; uiHandler.sendMessage(message); } } } class UIHandler extends Handler{ @Override public void handleMessage(Message msg) { if(msg.what == REFRESH_UI) { //从消息中获取返回结果 String res = (String) msg.obj; tvShow.setText(res); } } } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:id="@+id/show_res" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="hello_world" /> </RelativeLayout>