在编写项目的时候,本人发现一个关于线程与Handler很容易犯的错误。
我有两个Activity,一个Activity在后台创建了一个线程并且启动,这个线程对象对应的实体实在另外一个Activity的内部类中定义的,当我在Handler的handleMessage中想更新UI控件的值时,竟然给我报了一个NULL POINT,之前我以为是对应变量的值没初始化,后来才发现,原来跨Activity调用内部类的时候,一定要在新的Activity里面启动对应线程。下面用一个简单的例子说明,具体代码如下。
这里我是在点击按钮后启动线程new MyThread().start()的,之前的这个逻辑我是写在第一个Activity里面,所以出现了错误。
public class main extends Activity { private Button myButton01; private TextView Result;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); myButton01=(Button) findViewById(R.id.Button01); Result=(TextView) findViewById(R.id.Result); //监听方法
myButton01.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) {
// TODO Auto-generated method stub
new MyThread().start(); // myHandler.sendEmptyMessage(0);
}}); //创建Handler类的实例
Handler myHandler=new Handler(){ public void handleMessage(Message msg){
super.handleMessage(msg);
switch(msg.what){
case 2:
String s=(String)msg.obj;
Result.setText(s);
break; }
}
}; class MyThread extends Thread{ @Override
public void run() {
// TODO Auto-generated method stub
Message msg=new Message();
msg.what=2;
msg.obj="test";
myHandler.sendMessage(msg);
super.run();
} } }