您的位置:首页 > 其它

初识安卓之利用Handler进行线程间数据传递

2012-11-27 17:56 477 查看
背景:点击界面上一个按钮,使文本框中的数字加1,此过程中,如果按钮点击事件是开启了一个新的线程,让文本框中的文字加1,则运算后的结果无法返回到主线程中,主线程拿不到修改后的值,无法更新文本框的内容,这时,使用Handler来进行线程间的数据传递

以下为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; }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: