Android线程1 Handler处理更新UI子线程问题
2016-08-13 11:20
190 查看
我们知道,每个eActivity都有一个Main线程,也称之为UI线程,当在子线程中更新UI线程中的元素就会出现Crash。
解决方式就是通过handler解决。现在上代码,demo很简单,使用子线程更新Textview显示从update_0到update_49。
编程方法:
第一步:创建Handler,如下。Handler主要是为了处理消息用的,在消息回环中更新UI线程元素。
第二步骤:创建消息对象,并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对象进行更新。此种方式的代码如下所示:
代码地址在:
http://download.csdn.net/detail/zhangkai1992/9602339
解决方式就是通过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 1 Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached. Parameters r The Runnable that will be executed. Returns Returns 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的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- 后台线程处理数据,如何实时更新UI(datagridview)----多线程同步问题
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Handler中更新UI,如果报错子线程不能更新UI,可能出现的问题
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- android Thread 非线程更新UI界面(handler,runOnUiThread)解决图片加载慢的问题
- 关于android Handler进行线程处理消息队列与线程队列线程无法停止的问题
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- 如何干净的在服务中实现socket长链接与服务器通信并处理相应的线程问题(有更新)
- Android:在子线程中更新UI,解析异步消息处理机制(Handler)
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- C# winform 控件间线程更新问题处理方法
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制