在編寫項目的時候,本人發現一個關於線程與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(); } } }