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);
        }
    };
}