设为首页 |收藏本站
12345下一页
返回 发新帖回复

951

主题

0

好友

3010万

积分

管理员

Rank: 9Rank: 9Rank: 9

最佳新人 活跃会员 热心会员 推广达人 宣传达人 灌水之王 突出贡献 优秀版主 荣誉管理 论坛元老

发表于 2015-6-4 15:54:14 |显示全部楼层
HandlerThread在上一篇android耗时任务_handler中介绍了handler的运作机制,并且介绍了一个普通线程中产生looper并使用handler机制通信的简单例子。我们知道在普通线程中是没有looper的,也就不好在普通线程空间中使用handler机制,如果每次都像上一篇的例子那样做的话就会略显麻烦。其实Android已经封装了一个拥有自己looper的线程HandlerThread,它的实现和上一篇中给出的例子基本一,只是更加专业一点。下面是此类的详细代码。
public class HandlerThread extends Thread {
    private int mPriority;  
    private int mTid =-1;
    private Looper mLooper;
  
    publicHandlerThread(String name) {
        super(name);
        mPriority =Process.THREAD_PRIORITY_DEFAULT;
    }
  
    publicHandlerThread(String name, int priority) {
        super(name);
        mPriority =priority;
    }
  
    protected void onLooperPrepared() {
    }
  
    public void run() {
        mTid =Process.myTid();
        Looper.prepare();
        synchronized(this) {
            mLooper =Looper.myLooper();
            notifyAll();   
        }
       Process.setThreadPriority(mPriority);
       onLooperPrepared();
        Looper.loop();  
        mTid = -1;
    }
  


    public Looper getLooper() {
        if (!isAlive()) {
            return null;
        }
  
        // If the threadhas been started, wait until the looper has been created.
        synchronized(this) {
            while(isAlive() && mLooper == null) {
                try {
                   wait();
                } catch(InterruptedException e) {
                }
            }
        }
        return mLooper;
    }
  
    public boolean quit(){
        Looper looper =getLooper();
        if (looper !=null) {
           looper.quit();
            return true;
        }
        return false;
    }
  


    public intgetThreadId() {
        return mTid;
    }
}

此类就是继承了Thread类,使用此类时一定要注意必须start(),否则run()方法没有调用,handler机制也就没有建立起来。
经典应用对于HandlerThread的一个经典应用就是在service中的应用,我们知道,一般而言service是运行在主线程中的,在android耗时任务_ANR中我也建议在BroadcastReceiver中启动service,在service中启动线程处理耗时任务。那么如何启动线程,下面给出一个经典的代码:
public class BackService extends Service {

    private ServiceHandler serviceHandler;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }


    private final class ServiceHandler extends Handler {


        public ServiceHandler(Looper looper) {
            super(looper);
        }


        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            onHandleIntent((Intent) msg.obj);
            // 在其参数startId跟最后启动该service时生成的ID相等时才会执行停止服务。
            stopSelf(msg.arg1);
        }
    }


    @Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("BackService");
        thread.start();


        Looper serviceLooper = thread.getLooper();
        serviceHandler = new ServiceHandler(serviceLooper);
    }


    @Override
    public void onStart(Intent intent, int startId) {
        Message msg = serviceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        serviceHandler.sendMessage(msg);
    }


    protected void onHandleIntent(Intent intent) {
               //做你的异步任务
    }
}

回复

使用道具 举报

0

主题

0

好友

871

积分

高级会员

Rank: 4

发表于 2015-9-18 14:01:47 |显示全部楼层
好帖要顶,楼主的头像还是不错滴
回复

使用道具 举报

12345下一页
返回 发新帖 回复
您需要登录后才可以回帖 登录 | 立即注册

Powered by androidym! X2.5© 2001-2012 Comsenz Inc.( 交换友情链接:qq 87232433 )  
回顶部