初识安卓之利用Handler进行线程间数据传递
2012-11-27 17:56
477 查看
背景:点击界面上一个按钮,使文本框中的数字加1,此过程中,如果按钮点击事件是开启了一个新的线程,让文本框中的文字加1,则运算后的结果无法返回到主线程中,主线程拿不到修改后的值,无法更新文本框的内容,这时,使用Handler来进行线程间的数据传递
以下为DEMO
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以下为DEMO
public class PostActivityActivity extends Activity {
private TextView numTV;
int num;
//负责线程间的通信,解决新线程修改了数据,但操作不到主线程里去更新的问题
private Handler handler=new Handler(){
//msg是从按钮监听线程传过来的,是一个不断变化值的最新值,主线程在这里等待获取
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if(msg.what==1){
//传来的数据是被设置了类型的,所以要区分着拿
int num=msg.getData().getInt("num");
numTV.setText(num+"");
}
}
};
/** Called when the activity is first created. */
@Override
//handler通信方式一:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
numTV = (TextView) findViewById(R.id.numTV);
}
public void add1(View view){
new Thread(){
public void run(){
//在新线程里发送一个runnable对象,则主线程就会执行该对象的run方法
疑问:运算过程还是在主线程中进行的,如何提高效率,等于白做???
handler.post(new Runnable() {
@Override
public void run() {
//疑问:没有msg了怎么区分消息类型???
// TODO Auto-generated method stub
//只有创建numTV的线程才能操作numTV
numTV.setText(++num+"");
}
});
}
}.start();
}
//handler通信方式二:开启新的线程来执行按钮上的监听方法,可以提高效率,解耦
public void add2(View view){
new Thread(){
public void run(){
//创建一个消息对象,该对象内部有一个存放数据的map集合
Message msg=new Message();
//通过消息对象.getData的形式,可以拿到对象内部的map集合,并可以放入一些数据
msg.getData().putInt("num", ++num);
//把最新的数据通过handler发给创建handler的线程的线程,
//那个线程就会自动执行handler类的handlerMessage方法
//发消息之前还可以给msg指定类型,以便在主线程中获取时可以区分的拿到消息
msg.what=1;
handler.sendMessage(msg);
}
}.start();
}
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
相关文章推荐
- Android学习记录—利用Handler在线程中传递数据
- 利用Intent进行数据传递
- Handler利用bundle传递数据
- 利用 Parcelable 进行 Activity 之间的复杂数据传递
- Android--从零单排系列(7)--广播的使用和利用广播进行数据的传递
- 利用Application进行数据传递以及要注意的问题(内存泄漏)
- Android之利用EventBus进行数据传递
- Struts2服务器和Android客户端利用JSON进行数据的传递
- handler 进行主线程与子线程之间的信息传递
- Handler:子线程往主线程传递数据
- android传递数据的几种方式之利用全局变量进行传递
- .net利用SQLBulkCopy进行数据库之间的大批量数据传递
- 安卓客户端与jsp互相用json进行数据的传递与解析
- Android 利用handler在线程之间传递代码
- iOS开发-进阶:利用通知(NSNotification)进行数据传递
- QT通过线程将数据传递给主函数进行显示
- android studio for android learning (十一) 利用bundle在activity之间进行数据传递示例
- c#利用委托进行异步跨线程加载到窗体数据
- Android--从零单排系列(8)--service的使用和利用service进行数据的传递
- C++中两个线程用同一个list进行数据传递