Android面试常客-Handler上(handler的使用)

来源:互联网 发布:java重载构造函数 编辑:程序博客网 时间:2024/05/18 22:44

handler是什么?

handler是android给我们提供的用来更新UI的一套机制,也是一套消息处理机制,我们可以用来发送消息,也可以通过它来处理消息,在android中,anctivty的生命周期就是有handler实现。

为什么要用handler?可以不用吗?

是不可以的,Android在设计的时候,就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制的话就没有办法更新UI信息,就会抛出异常信息。

handler的用法

handler用法一

handler在android developers中的说明

那么在官方给出的handler说明中主要说明了:我们创建一个handler的时候,会跟一个默认的线程绑定,这个线程中就有一个Message queue,Message queue就是一个消息队列。

handler的作用:

  • 定时发送一个消息或者Runnable
  • 在一个线程中处理一个动作

在非UI线程跟新UI会出现什么异常?

创建一个android项目
MainActivity.java

public class MainActivity extends AppCompatActivity {private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    textView= (TextView) findViewById(R.id.textView);            new Thread(new Runnable() {                @Override                public void run() {                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    textView.setText("I am Bree ");                }            }).start();        }    }

activity_main.xml

      <TextView        android:id="@+id/textView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Hello World!" />

运行项目会出现以下异常

    03-15 14:29:46.953 5774-5800/bree.com.handlertest E/AndroidRuntime: FATAL EXCEPTION: Thread-350                                                                Process: bree.com.handlertest, PID: 5774                                                                android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.                                                                    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6118)                                                                    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:837)                                                                    at android.view.View.requestLayout(View.java:16648)                                                                    at android.view.View.requestLayout(View.java:16648)                                                                    at android.view.View.requestLayout(View.java:16648)                                                                    at android.view.View.requestLayout(View.java:16648)                                                                    at android.view.View.requestLayout(View.java:16648)                                                                    at android.view.View.requestLayout(View.java:16648)                                                                    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:352)                                                                    at android.view.View.requestLayout(View.java:16648)                                                                    at android.widget.TextView.checkForRelayout(TextView.java:6610)                                                                    at android.widget.TextView.setText(TextView.java:3822)                                                                    at android.widget.TextView.setText(TextView.java:3680)                                                                    at android.widget.TextView.setText(TextView.java:3655)                                                                    at bree.com.handlertest.MainActivity$1.run(MainActivity.java:24)                                                                    at java.lang.Thread.run(Thread.java:841)

异常信息为不可以在子线程中更新UI,在android开发中是不允许的。

handler.post(Runnable runnable)

使用这个方法进行更新UI,修改MainActivity中的代码,如下:

        public class MainActivity extends AppCompatActivity {        private TextView textView;        private Handler handler=new Handler();        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.activity_main);            textView= (TextView) findViewById(R.id.textView);            new Thread(new Runnable() {                @Override                public void run() {                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    handler.post(new Runnable() {                        @Override                        public void run() {                            textView.setText("I am Bree ");                        }                    });                }            }).start();        }    }

在子线程中使用handler就可以修改TextView中显示的内容。

handler.postDelayed(Runnable runnable,long time)

这个方法的意思是在time毫秒后执行Runnable中定义的动作,再次不做代码粘贴了,大家可自行测试。

handler用法二

MainAvtivity.java

    public class MainActivity extends AppCompatActivity {    private TextView textView;    private Handler handler=new Handler(new Handler.Callback() {        /**         * 此方法如果返回ture则拦截发过来的消息         * @param message         * @return         */        @Override        public boolean handleMessage(Message message) {            return false;        }    }){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            //根据msg处理消息        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView= (TextView) findViewById(R.id.textView);        new Thread(new Runnable() {            @Override            public void run() {                //1发送一个空消息                handler.sendEmptyMessage(1);                //2.发送一个Message                //handler.obtainMessage();由系统之取出Message的对象,如果没有则自动新建                //也可以Message message=new Message();  当然啦既然系统都提供了,咱么就不要新建啦                Message message=handler.obtainMessage();                message.arg1=1;                message.what=10;                //message.obj=发送一个对象                handler.sendMessage(message);            }        }).start();    }}
0 0
原创粉丝点击