首页 > 代码库 > Android启动新线程的几种方式

Android启动新线程的几种方式

a:

public class HandlerTest01 extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                System.out.println("Activity —> " + Thread.currentThread().getId());        handler.post(r);    }     private Handler handler = new Handler();    private Runnable r = new Runnable() {        @Override        public void run() {            try {                Thread.sleep(2000);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            System.out.println("Runnalbe —> " + Thread.currentThread().getId());        }    };}

通过这个例子的输出可以发现,Runnable对象和主用户界面线程的ID是相同。在这个例子中,我们直接利用handler对象post了一个runnable对象,相当于直接调用了Runnable对象的run函数,也就说没有经过start函数调用run(),那么就不会创建一个新线程,而是在原有线程内部直接调用run()方法,因此输出的线程Id是相同的。

 b:

HandlerThread handlerthread = new HandlerThread("MyThread");handlerthread.start();private MyHandler handler = new MyHandler(handlerthread.getLooper()); class MyHandler extends Handler {    public MyHandler() {     }     public MyHandler(Looper looper) {        super(looper);    }}下面这个例子,将介绍如何开启一个新的线程,并通过Handler处理消息。  HandlerTest02.javapublic class HandlerTest02 extends Activity {     private MyHandler myhandler = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        this.setContentView(R.layout.main);        System.out.println("Activity —> " + Thread.currentThread().getId());                // 生成一个HandlerThread对象,使用Looper来处理消息队列        HandlerThread thread = new HandlerThread("MyThread");        // 必须启动这个线程        thread.start();        // 将一个线程绑定到Handler对象上,则该Handler对象就可以处理线程的消息队列        myhandler = new MyHandler(thread.getLooper());        // 从Handler中获取消息对象        Message msg = myhandler.obtainMessage();        // 将msg对象发送给目标对象Handler        msg.sendToTarget();    }     class MyHandler extends Handler {        public MyHandler() {                    }                // 带有参数的构造函数        public MyHandler(Looper looper) {            super(looper);        }                @Override        public void handleMessage(Message msg) {            System.out.println("MyHandler —> " + Thread.currentThread().getId());        }    }}

根据这个例子返回的结果,可以看出,新线程Id与主用户界面的线程Id不同。由于我们调用了thread.start()方法,真正的创建了一个新线程,与原来的线程处于不同的线程上下文中,因此打印输出的线程Id是不同的。

c:

public class ThreadTest extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        this.setContentView(R.layout.main);        System.out.println("Activity —> " + Thread.currentThread().getId());                Thread thread = new Thread(r);        thread.start();        try {            Thread.currentThread().sleep(1000);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        thread.stop();    }     Runnable r = new Runnable() {        @Override        public void run() {            System.out.println("Runnable —> " + Thread.currentThread().getId());        }    };}

  新线程在创建对象时,传入了Runnable类的一个对象,在Runnable对象中重载了run()方法去执行耗时的操作;新的线程实例执行了start方法,开启了一个新的线程执行Runnable的run方法。

d:

Handler myHandler = new Handler() {    public void handleMessage(Message msg) {        updateUIHere();    }} new Thread() {    public void run() {        doStuff();         // 执行耗时操作        Message msg = myHandler.obtainMessage();        Bundle b = new Bundle();        b.putString("key", "value");        m.setData(b);    // 向消息中添加数据        myHandler.sendMessage(m);    // 向Handler发送消息,更新UI    }}.start();

  

Android启动新线程的几种方式