Android程序的主線程(UI線程)無法跑有時間耗費的代碼,所以一個好習慣是將各種與UI無關的操作,比如網絡通信(包括http、ftp、mail、socket)、文件操作、數值計算等放在子線程中。爲了方便操作UI線程(Activity主類)中的各種方法和變量,將子線程寫成Activity主類中的內部類是個較省事的方式。
實例代碼:
Archer_runnable()可直接使用主類中的Message和bundle來向主類發送消息,也可使用主類中定義的其它方法。
import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.widget.Toast; public class MainActivity extends Activity { private Thread Archer_Thread; // ------------------------------------ private Message msg; private Bundle bundle; private StringBuilder sb_contact; // ------------------------------------ public MainActivity() { } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button bn_Ballista = (Button) this.findViewById(R.id.button_Ballista); bn_Ballista.setOnClickListener(new BallistaListener()); Archer_Thread = new Thread(Archer_runnable); Archer_Thread.start(); } public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public Handler mHandler = new Handler() { String str_tmp; public void handleMessage(Message msg) { switch (msg.what) { case 0x12: { str_tmp = msg.getData().getString("result"); Toast.makeText(MainActivity.this, "...", Toast.LENGTH_SHORT) .show(); break; } default: break; } } }; Runnable Archer_runnable = new Runnable() { public void run() { sb_contact = new StringBuilder("contact: "); msg = new Message(); bundle = new Bundle(); // /----------------------------------------- msg.what = 0x12; bundle.putString("result", sb_contact.toString()); msg.setData(bundle); mHandler.sendMessage(msg); } }; }