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.java

public 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();

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。