子线程的认识
来源:互联网 发布:amx m4 54数据 编辑:程序博客网 时间:2024/06/02 01:43
消息机制,对于Android开发者来说,应该是非常熟悉。对于处理有着大量交互的场景,采用消息机制,是再好不过了。有些特殊的场景,比如我们都知道,在Android开发中,子线程不能更新UI,而主线程又不能进行耗时操作,一种常用的处理方法就是,在子线程中进行耗时操作,完成之后发送消息,通知主线程更新UI。或者使用异步任务,异步任务的实质也是对消息机制的封装。
常见的异常为:
AndroidRuntime: FATAL EXCEPTION: Thread-176 Process: com.example.joy.messagetest, PID: 11201 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357) at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:874)
说明线程存在异常,子线程不能更新ui。
布局文件:
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.joy.messagetest.MainActivity"> <TextView android:id="@+id/tv_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="Hello World!" /> <Button android:id="@+id/btn_test1" android:layout_below="@id/tv_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="子线程更新UI测试"/> <Button android:id="@+id/btn_test2" android:layout_below="@id/btn_test1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="Handler发送消息"/> <Button android:id="@+id/btn_test3" android:layout_below="@id/btn_test2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="Handler.Post"/> <Button android:id="@+id/btn_test4" android:layout_below="@id/btn_test3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="View.Post"/> <Button android:id="@+id/btn_test5" android:layout_below="@id/btn_test4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="Activity.RunOnUIThread"/></RelativeLayout>
java代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView mTvTest; private Button mBtnTest1; private Button mBtnTest2; private Button mBtnTest3; private Button mBtnTest4; private Button mBtnTest5; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 100) { mTvTest.setText("由Handler发送消息"); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); new Thread(new Runnable() { @Override public void run() { mTvTest.setText("子线程可以更新UI"); } }).start(); } private void initView() { mTvTest = (TextView) findViewById(R.id.tv_test); mBtnTest1 = (Button) findViewById(R.id.btn_test1); mBtnTest2 = (Button) findViewById(R.id.btn_test2); mBtnTest3 = (Button) findViewById(R.id.btn_test3); mBtnTest4 = (Button) findViewById(R.id.btn_test4); mBtnTest5 = (Button) findViewById(R.id.btn_test5); mBtnTest1.setOnClickListener(this); mBtnTest2.setOnClickListener(this); mBtnTest2.setOnClickListener(this); mBtnTest3.setOnClickListener(this); mBtnTest4.setOnClickListener(this); mBtnTest5.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_test1: new Thread(new Runnable() { @Override public void run() { mTvTest.setText("子线程真的可以更新UI吗?"); } }).start(); break; case R.id.btn_test2: //通过发送消息 new Thread(new Runnable() { @Override public void run() { mHandler.sendEmptyMessage(100); } }).start(); break; case R.id.btn_test3: //通过Handler.post方法 new Thread(new Runnable() { @Override public void run() { mHandler.post(new Runnable() { @Override public void run() { mTvTest.setText("handler.post"); } }); } }).start(); break; case R.id.btn_test4: //通过 view.post方法 new Thread(new Runnable() { @Override public void run() { mTvTest.post(new Runnable() { @Override public void run() { mTvTest.setText("view.post"); } }); } }).start(); break; case R.id.btn_test5: //通过 activity 的 runOnUiThread方法 new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { mTvTest.setText("runOnUIThread"); } }); } }).start(); break; default: break; } }}其中点击第一个按钮是错误示范,也是常见的异常情况。
阅读全文
0 0
- 子线程的认识
- 线程的认识
- 我认识的线程
- 我认识的线程
- 认识Delphi的线程类
- 对线程的一点认识
- C#中线程的认识
- 对线程的基本认识
- 对线程Thread的认识
- 向量子空间的一些错误认识
- 线程认识
- 线程认识
- 子进程与子线程的区别
- 线程局部变量ThreadLocal的认识
- 多线程(认识多线程、线程的常用操作方法)
- 多线程(认识多线程、线程的常用操作方法)
- 第四十讲 感性的认识线程
- 多线程(认识多线程、线程的常用操作方法)
- rabbitmq集群(一)介绍
- 面试笔试整理5:项目问题准备
- javascript中构造函数和prototype属性
- JVM(2):JVM内存结构
- JMeter逻辑控制器
- 子线程的认识
- echarts中饼图的异步数据加载绘制
- hive-02-hive文件存储格式
- 【Android】 文件存取
- ajax上传问题
- Multi-Scale Context Aggregation by Dilated Convolution 对空洞卷积(扩张卷积)、感受野的理解
- Gitlab 配置外部PostgreSQL
- js如何去除html标签
- ccf 交通规划 dijkstra+最小路径花费