Anndroid学习---使用线程Handler
来源:互联网 发布:sql复制表结构 编辑:程序博客网 时间:2024/05/23 21:49
Anndroid学习—使用线程 Handler
使用Java里面常用的线程调用方式,发现不可以
1 .
package com.example.administrator.myapplication;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;public class MainActivity extends AppCompatActivity { EditText editText; Button button; Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText2); button = (Button) findViewById(R.id.button); /* handler = new Handler(){ @Override public void handleMessage(Message msg) {// super.handleMessage(msg); editText.setText("star Thread"); } };*/ button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {// editText.setText("sss"); MyThread myThread = new MyThread(); myThread.start(); } }); } class MyThread extends Thread{ @Override public void run() {// super.run(); editText.setText("star Thread"); /* try { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); }*/// handler.sendEmptyMessage(0); } }}
2 . 分析错误
E/AndroidRuntime: FATAL EXCEPTION: Thread-192 Process: com.example.administrator.myapplication, PID: 3528 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.invalidateChildInParent(ViewRootImpl.java:909) at android.view.ViewGroup.invalidateChild(ViewGroup.java:4690)
Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行,如果在非UI线程中直接操作UI线程,
会抛出android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that
created a view hierarchy can touch its views,这与普通的java程序不同。
由于UI线程负责事件的监听和绘图,因此,必须保证UI线程能够随时响应用户的需求,
UI线程里的操作应该向中断事件那样短小,费时的操作(如网络连接)需要另开线程,
否则,如果UI线程超过5s没有响应用户请求,会弹出对话框提醒用户终止应用程序(ANP)。
如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,
因此android采用一种的Message Queue机制保证线程间通信。
可以在自己的子线程中创建Handler与UI thread通讯
线程的简单使用-点击按钮文本框显示指定内容
package com.example.administrator.myapplication;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { EditText editText; Button button; Handler handler; MyThread myThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText2); button = (Button) findViewById(R.id.button); handler = new Handler(){ @Override public void handleMessage(Message msg) {// super.handleMessage(msg); editText.setText("star Thread"); } }; button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {// editText.setText("sss"); myThread = new MyThread(); myThread.start(); } }); } class MyThread extends Thread{ @Override public void run() { while(true){ try { Thread.sleep(1000); handler.sendEmptyMessage(0); } catch (InterruptedException e) { e.printStackTrace(); } } } }}
用thread handler 实现图片变换
package com.example.administrator.myapplication;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { EditText editText; Button button; Button button2; Handler handler; ImageView imageView; MyThread myThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText2); button = (Button) findViewById(R.id.button); imageView = (ImageView) findViewById(R.id.imageView); button2= (Button) findViewById(R.id.button2); handler = new Handler(){ @Override public void handleMessage(Message msg) {// super.handleMessage(msg); switch (msg.what){ case 1 : imageView.setImageResource(R.mipmap.ic_launcher); break; case 2 : imageView.setImageResource(R.mipmap.abc_ic_star_black_16dp); break; } // editText.setText("star Thread"); } }; button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {// editText.setText("sss"); myThread = new MyThread(); myThread.is= true; myThread.start(); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { myThread.is= false; } }); } class MyThread extends Thread{ boolean is=true; @Override public void run() { int what = 1; while(is){ try { Thread.sleep(1000); handler.sendEmptyMessage((what++)%2+1); } catch (InterruptedException e) { e.printStackTrace(); } } } }}
0 0
- Anndroid学习---使用线程Handler
- Handler 线程中的使用
- Android线程Handler的学习
- 线程Looper+Handler+Thread学习
- 线程Looper+Handler+Thread学习
- 使用Handler.post管理线程
- Android 线程之Handler使用
- 使用Handler处理线程通信
- Handler 使用学习总结
- android学习---使用Handler
- android学习笔记---使用AsyncTask实现异步处理,内部使用线程加Handler
- 学习在新线程中使用Handler更新UI的方法
- 搬迁学习笔记1——Handler的基本使用、子线程更新UI的方式
- Android Handler/Looper/MessageQueue 在新线程中使用Handler
- Android 线程学习之 Handler介绍
- 在工作线程(WorkerThread)中使用Handler
- Android线程中handler的使用
- 在工作线程(WorkerThread)中使用Handler
- 多层级标签的提交,利用jquery拼接json,后台转java对象
- MyBatis 一对多关系
- excel添加超链接
- LeetCode 402. Remove K Digits
- 用Maven实现一个protobuf的Java例子
- Anndroid学习---使用线程Handler
- mysql字母数字混合排序
- map迭代方法
- 抽象类和普通类的区别
- 组合计数(容斥定理+卢卡斯定理的正确姿势)
- BZOJ 4809: 皇后 (n皇后问题)dfs搜索入门
- 使用python批量爬取apk文件
- JAVA的三大特性
- [leetcode]213. House Robber II