LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
history history 的推荐 someone-history.lofter.com
AndroidLearn

Handler与Thread

启动“线程”

    handler.post(manaThread);

结束“线程”

    handler.removeCallbacks(manaThread);

创建线程并重写消息处理方法

Handlerhandler = new Handler(){

    @Override

    publicvoid handleMessage(Message ms){

    //这里可以获取ms的属性,用ms...

启动“线程”

    handler.post(manaThread);

结束“线程”

    handler.removeCallbacks(manaThread);

创建线程并重写消息处理方法

Handlerhandler = new Handler(){

    @Override

    publicvoid handleMessage(Message ms){

    //这里可以获取ms的属性,用ms.arg1和ms.arg2

    intpre=ms.arg1;

    //线程如果睡眠,则需再次放进线程队列

    handler.post(manaThread);

    }

}

RunnablemanaThread = new Runnable(){

    @Override

    publicvoid run(){

    //定制要发送的消息

    Messagems=handler.obtainMessage();

    ms.arg1=1;

    //如果是定是操做,则线程需要睡眠

    Thread.sleep(2000);

    //发送消息

    handler.sendMessage(ms);

    }

}

OK如果你按我的写法做过实验,你会发现:当线程睡眠时,Acitvity不能接收请求了,就是WIN中的”程序无法响应”(不信?你把睡眠时间改长一点)

那么,这是怎么回事呢?

so...let us analyze it...

没错!就是你想的那样,handler现在是依附在主线程上面的,也就是说,并没有实现我们想要的多线程效果。

下面,让我们来实现一个比较接近点的多线程吧

classStartOnClick implementsOnClickListener{ 

    public void onClick(View v) {

    HandlerThreadhandlerThread=newHandlerThread("ht");

    handlerThread.start();

    NewHandlernewHandler=newNewHandler(handlerThread.getLooper());

    Messagems=newHandler.obtainMessage();

    ms.arg1=1;

    ms.sendToTarget();

}};

classNewHandler extendsHandler{

    public New Handler(Looper looper) {

        super(looper);

    }

    @Override

    publicvoidhandleMessage(Message msg) {

        Log.i("线程信息接收成功",msg.arg1+"");

    }

}

classEndBtnOnClick implementsOnClickListener {

    @Override

    publicvoidonClick(View v) {

    handlerThread.interrupt();

    Log.i("线程状态","线程已释放");

    }

}

不过,你应该发现了一个问题,在子线程里面不能更新UI,因为那是主线程的

所以,下面,我以一个实例来表达我的理解:

private int count=0;

private HandlerThread handlerThread;

//点击事件启动

class StartOnClick implements OnClickListener{

    @Override

    public void onClick(View v) {

        handlerThread=new HandlerThread("ht");

        handlerThread.start();

        NewHandler newHandler=new NewHandler(handlerThread.getLooper());

        Messagems=newHandler.obtainMessage();

        ms.arg1=++count;

        ms.sendToTarget();

    }

}

//子线程处理代码

class NewHandler extends Handler{

    public NewHandler(Looper looper) {

        super(looper);

    }

    @Override

    //执行完想要的操作,就交给handler去处理UI了

    public void handleMessage(Message msg) {

        Log.i("子线程消息接收成功",msg.arg1+"");

        if(msg.arg1==5){

            handler.post(manaThread);

        }

    }

}

//handler处理代码

Runnable manaThread=new Runnable() {

    @Override

    //附加到主线程并发送消息

    public void run() {

        Message ms=handler.obtainMessage();

        ms.arg1=count;

        handler.sendMessage(ms);

    }

};

//取出消息,更新UI

Handler handler=new Handler(){

    public void handleMessage(Message msg) {

        txtShow.setText(msg.arg1+"");

        Log.i("主线程接收成功!",msg.arg1+"");

    }

};

//释放子线程

class EndBtnOnClick implementsOnClickListener {

    @Override

    public void onClick(View v) {

        handlerThread.interrupt();

        Log.i("子线程状态:","线程释放结束");

    }

}


OK就是这些了,希望你可以与我交流经验