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; } }
实现效果如下: