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

  

时间: 2024-10-08 20:50:21

Android启动新线程的几种方式的相关文章

Android-Service中执行新线程的几种方式

大家都知道,service和activity都是运行在UI线程中,超时的数据读取和网络耗时等操作必须新建线程,下面说说service中执行新线程的几种方式. 1.传统的java方式 我们都知道 java中新建线程可以继承Thread类,也可以implement Runnable接口.实质都是实现Runnable的run方法,此处底层应该是jvm识别run这个方法分配并且创建了线程.run方法只是准备好了新线程的资源,要调用 start() native方法才能启动线程. 1 public int

Android-创建启动线程的两种方式

方式一:成为Thread的子类,然后在Thread的子类.start 缺点:存在耦合度(因为线程任务run方法里面的业务逻辑 和 线程启动耦合了) 缺点:Cat extends Thread {} 后无法在继承其他的类了 注意:?? Cat一旦继承Thread,Cat就属于线程对象 示例: package android.java.thread04; /** * 定义线程的第一种方式 成为Thread的子类 */ class Cat extends Thread { @Override publ

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方

java创建线程的三种方式及其对照

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类.并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务.因此把run()方法称为运行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法.run方法的方

【转】Android播放音频MediaPlayer的几种方式介绍

接下来笔者介绍一下Android中播放音频的几种方式,android.media包下面包含了Android开发中媒体类,当然笔者不会依次去介绍,下面介绍几个音频播放中常用的类: 1.使用MediaPlayer播放音频 MediaPlayer的功能很强大,下面附上一张该类封装音频的生命周期图: MediaPlayer支持AAC.AMR.FLAC.MP3.MIDI.OGG.PCM等格式,MediaPlayer可以通过设置元数据和播放源来音频. 1.1播放Raw文件夹下面音频的元数据 //直接创建,不

死锁现象与解决方案,开启线程的2种方式,守护线程,线程VS进程,线程互斥锁,信号量

死锁现象与解决方案 from threading import Thread,Lock,active_count import time mutexA=Lock() # 锁1 mutexB=Lock() # 锁2 class Mythread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('%s 拿到A锁' %self.name) mutexB.acquire() print('%

创建线程的两种方式比较Thread VS Runnable

1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 1 public class MyThread extends Thread{ 2 @Override 3 public void run() { 4 // TODO Auto-generated method stub 5 6 } 7 } 8 //线程使用 9 MyThread mt = new MyThread(); //创建线程 10 mt.start(); //启动线程 另外一种方式是实现Runnabl

黑马程序员——创建线程的两种方式

java中创建线程有两种方式: 1.继承Thread类 步骤: (1)定义一个类继承Thread类 (2)复写Thread类中的run()方法 (3)调用start()方法:启动线程及调用run()方法 2.实现Runnable接口的方式 步骤:(1)定义一个类实现Runnable接口 (2)覆盖Runnable接口中的run()方法,将线程要运行的代码放到该run方法中 (3)通过Thread类建立线程对象 (4)将实现Runable接口的类对象作为实际参数传递给Thread的构造函数. (5

创建线程的三种方式

创建线程的三种方式 第一种:通过NSThread的对象方法 第二种:通过NSThread的类方法 第三种:通过NSObject的方法 准备在后台线程调用的方法 longOperation: - (void)longOperation:(id)obj { NSLog(@"%@ - %@", [NSThread currentThread], obj); } 方式1:alloc / init - start - (void)threadDemo1 { NSLog(@"before