您的位置:首页 > 移动开发 > Android开发

Android中Thread的使用之Handler机制

2015-07-04 21:13 465 查看
Android中子线程和java中的swt插件一样,也是不能直接操作主线程的数据的,相对于java中的异步调用,Android线程中采用了一种Handler消息机制,来实现此功能。

通俗的来说的话其原理也不难,首先主线程在运行,子线程也在运行,那么在主线程和子线程中间有一个叫MessageQueue的队列,子线程把要在主线程中显示的数据存在Message中,然后再通过haddler将消息发送到消息队列中,主线程中通过android系统自身对应的时间(具体看其机制),去消息队列中,根据存进去的编号取得相应的值,达到数据的交互作用。

具体的测试代码如下:

public class Main2Activity extends Activity {

public static final int INSCODE=1;

private TextView tv4;

private TextView tv5;

//handler:从队列中取出来数据,这是android系统自己完成的,具体多久去拿一次数据不清除

private Handler handler=new Handler(){

public void handleMessage(Message msg) {

switch (msg.what) { //编号,用来区分是什么的,时间还是别的

case 1:

String time=(String)msg.obj;//obj:取得的对象

tv5.setText(time);

break;

}

super.handleMessage(msg);

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//获取跳转之前的意图

Intent intent=super.getIntent();

String uname=(String)intent.getExtras().get("uname");

TextView tv1=(TextView) super.findViewById(R.id.textView1);

tv4=(TextView) super.findViewById(R.id.textView4);

tv5=(TextView) super.findViewById(R.id.textView55);

tv1.setText("欢迎您:"+uname);

Button
btn=(Button) super.findViewById(R.id.button1);

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

Intent intent=new Intent(Main2Activity.this,LoveActivity.class);

//注意这里不同,打开后面页面的方法不一样,因为要接收后面页面回传的结果

Main2Activity.this.startActivityForResult(intent, INSCODE);

}

});

new Thread(new Runnable() {

@Override

public void run() {

while(true){

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

Date d=new Date();

SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");

String t=sdf.format(d);

//将时间存到Message对象中,再通过haddler将消息发送到消息队列即可

Message m=new Message();

m.what=1;

m.obj=t;

//发到消息队列中

handler.sendMessage(m);

}

}

}).start();

}

@Override //当新窗口操作完(finish()新窗口必须要操作完才能回调这个方法),则会回传数据,回传的结果会由androind系统自动回调到这个方法

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (requestCode) {

case INSCODE:

if(resultCode==RESULT_OK){

String result=(String)data.getExtras().get("result");

Log.i("测试", result);

tv4.setText(result);

}

break;

}

super.onActivityResult(requestCode, resultCode, data);

}

}

总的来说,android学习线程的入门还是不难的,但是要到更深层次还是要好好的静心学习,加油
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: