在编写项目的时候,本人发现一个关于线程与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(); } } }