Android线程1 Handler处理更新UI子线程问题
来源:互联网 发布:java实现密钥进行加密 编辑:程序博客网 时间:2024/05/15 15:28
我们知道,每个eActivity都有一个Main线程,也称之为UI线程,当在子线程中更新UI线程中的元素就会出现Crash。
解决方式就是通过handler解决。现在上代码,demo很简单,使用子线程更新Textview显示从update_0到update_49。
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private TextView text; private static final int UPDATE_TEXTVIEW = 1; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case UPDATE_TEXTVIEW: String update_text = (String)msg.obj; text.setText(update_text); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView)findViewById(R.id.text); new Thread(new Runnable() { @Override public void run() { for(int i=0;i<50;i++){ String update_text = "update_"+i; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //Message.obtain() Message.obtain(handler,UPDATE_TEXTVIEW,update_text).sendToTarget(); /*Message message = new Message(); message.what = UPDATE_TEXTVIEW; message.obj = update_text; handler.sendMessage(message);*/ } } }).start(); }}
编程方法:
第一步:创建Handler,如下。Handler主要是为了处理消息用的,在消息回环中更新UI线程元素。
private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case UPDATE_TEXTVIEW: String update_text = (String)msg.obj; text.setText(update_text); break; default: break; } } };
第二步骤:创建消息对象,并send到Handler Target。此处方法很多:
1,Message.obtain(handler,UPDATE_TEXTVIEW,update_text).sendToTarget();
2,Message message = new Message();
message.what = UPDATE_TEXTVIEW;
message.obj = update_text;
handler.sendMessage(message);
但是看看API官网中Mesaage 构造函数:
Message()
Constructor (but the preferred way to get a Message is to call Message.obtain()).
推荐使用obtain方法。
3,有一种很简洁的方式更新UI线程元素,就是直接使用Handler.post(Runnable)。这样就可以不建立消息Message对象进行更新。此种方式的代码如下所示:
public final boolean post (Runnable r)Added in API level 1Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached.Parametersr The Runnable that will be executed.ReturnsReturns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView)findViewById(R.id.text); new Thread(new Runnable() { @Override public void run() { for(int i=0;i<50;i++){ final String update_text = "update_"+i; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //Message.obtain() //Message.obtain(handler,UPDATE_TEXTVIEW,update_text).sendToTarget(); /*Message message = new Message(); message.what = UPDATE_TEXTVIEW; message.obj = update_text; handler.sendMessage(message);*/ handler.post(new Runnable() { @Override public void run() { text.setText(update_text); } }); } } }).start(); }
代码地址在:
http://download.csdn.net/detail/zhangkai1992/9602339
- Android线程1 Handler处理更新UI子线程问题
- Android:在子线程中更新UI,解析异步消息处理机制(Handler)
- Android-初识Handler-子线程异步更新UI
- Android子线程更新UI主线程方法之Handler
- Android子线程更新UI主线程方法之Handler
- Android 子线程更新UI
- Android 子线程更新 UI
- Android 子线程更新UI
- Android 子线程更新UI
- android子线程更新UI
- android子线程更新UI
- android子线程更新UI
- 在Android子线程中初始化handler后,为什么该子线程也能更新UI?
- 关于Android子线程不能更新UI的问题
- 关于Handler处理UI线程的更新及Handler译文
- 子线程更新UI
- 子线程更新UI
- 子线程更新ui
- HDU 5818 Joint Stacks 模拟
- leetcode:暴力枚举法之Subsets
- 教你小小JAVA爬虫爬到HDU首页(只为学习)
- Build boost in Windows7 64bit VS2013
- H.264编码原理和I帧P帧B帧原理
- Android线程1 Handler处理更新UI子线程问题
- 精益技术简历之道
- 文章标题
- yii框架生成简历文档
- HDU2182 Lost Cows
- Tomcat部署项目的方式
- 晋升条件
- java的四种引用类型
- Error: L6411E: No compatible library exists with a definition of startup symbol __main.