sunstarchen 2015-04-30
同学们一定遇到过这样的问题,在另一个类中处理好的数据,想要更新到主线程UI上
会发现更新失败,而在java平时编程中是可以的,其实这是安卓特有的规定,子线程不能直接将数据更新到主线程UI上,那么我们怎么做到去传递消息呢?
这里就要用到Handler 和Message了。这里我们建立一个实例看看怎么用,这里设置每隔1秒在主线程更新递增。
定义布局管理器:activity_main
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>主Activity函数代码:
public class MainActivity extends Activity {
private static int count=0;
public static final int SET=1;//之所以定义final,是因为在内部类也能使用,设置what标记
private TextView info=null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.info=(TextView)super.findViewById(R.id.info);
Timer timer=new Timer();//定义调度器
timer.schedule(new MyTask(), 0,1000);//立即开始,每隔一秒增长
}
/*
* 设置一个Handler对象
*/
private Handler myHandler=new Handler(){
public void handleMessage(android.os.Message msg){
switch(msg.what){//判断操作类型
case SET:
MainActivity.this.info.setText("ee"+count++);//设置文本操作
}
}
};
/*
* 定义定时调度的具体实现类,相当于子线程
*/
private class MyTask extends TimerTask{
@Override
public void run() {
Message msg=new Message();//定义Message
msg.what=SET;//类型
MainActivity.this.myHandler.sendMessage(msg);//发送消息
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}实现效果如下:

