风言枫语  

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


 


 

posted on 2013-09-06 21:02  风言枫语  阅读(156)  评论(0编辑  收藏  举报