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
- Android面试常客-Handler上(handler的使用)
- Android面试常客Handler详解
- 面试常客Handler详细解析(Handler与Looper、MessageQueue的关系)(二)
- 面试常客Handler详细解析(自定义与线程相关的Handler)(三)
- 面试常客Handler详细解析(handler基础)(一)
- 面试常客Handler详细解析(更新UI的几种方式)(六)
- 面试常客Handler详细解析(HandlerThread是什么)(四)
- Handler的使用上
- Android性能优化篇(三),常客Handler、Thread泄露
- android handler的使用
- Android Handler的使用
- Android Handler的使用
- Android Handler的使用
- Android Handler的使用
- Android Handler的使用
- Android Handler的使用
- Android Handler的使用
- Android Handler的使用
- Servlet监听器
- noi-8170-紧急措施
- CDH开启kerberos,Java连接Hbase
- 在iOS开发中使用iconfont图标
- 如何在android面试中说清楚android中binder机制的实现过程
- Android面试常客-Handler上(handler的使用)
- lua写的敏感词过滤
- NC65开发环境ESAPI错误及各种查询调用错误解决方案
- 存储过程日志表
- web服务器使用JSP创建网页的过程
- 性能调优之:缓存
- 日志输出
- 报错相关
- X5之commander