学习总结——android的消息机制handler

来源:互联网 发布:dnf一进pk场就网络中断 编辑:程序博客网 时间:2024/05/17 04:36

写在前面:

近来总是怀疑自己的前面究竟还有没有出路,菜鸟初飞总是畏畏缩缩。在茫茫海雾面前,我不知道前面是否有瑰丽晚霞。也总是出现学了就忘,知识理解不够深入,知识点之间没有联系的问题。如此循环,甚是让人沮丧。由此,我将开始博客记录学习过程中的知识点总结,彼此的联系,自己的感悟等等。

一旦需要和别人讲述某个概念或者知识的时候,却发现无法表述清楚,这是一种普遍现象,原因是我们其实并没有真正的理解,学习不到位。
如果我们总是在接触新的知识,却没有停下来去整合它们,并将付诸实践,继续这样不停地接触新知识,我们的大脑就会堵塞。

学到后面,我又将本文中的一些错误偏差改正过来,希望本文更加严谨。

一.从所写代码开始:

import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ProgressBar;public class TestBarHandler extends AppCompatActivity {    private Button starbutton;    private ProgressBar mprogressbar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test_bar_handler);        starbutton = (Button) findViewById(R.id.starbutton);        mprogressbar = (ProgressBar) findViewById(R.id.mprogressbar);        starbutton.setOnClickListener(new buttonListener());    }    class buttonListener implements View.OnClickListener{        @Override        public void onClick(View v) {            mprogressbar.setVisibility(View.VISIBLE);            updateBarHandler.post(updatethread);        }    }    Handler updateBarHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            mprogressbar.setProgress(msg.arg1);            updateBarHandler.post(updatethread);        }    };    Runnable updatethread = new Runnable() {        int i = 0;        @Override        public void run() {            System.out.println("Begin Thread");            i = i + 10;            Message msg = updateBarHandler.obtainMessage();            msg.arg1 = i;            try {                Thread.sleep(3000);            } catch (InterruptedException e) {                e.printStackTrace();            }            updateBarHandler.sendMessage(msg);            if(i == 100){                updateBarHandler.removeCallbacks(updatethread);            }        }    };}

代码执行流程:
为button设置监听器后,点击button按钮,将进度条设置为可见,并将线程updatethread加入线程队列中。
然后在updatethread中,创建一个message,并将message的一个成员变量msg1设置值。通过handler的sendmessage()方法将message加入消息队列中。
最后用handler中的handlermessage()方法取出消息。(其实主要是消息携带的成员变量msg1),用msg1修改进度条的值。修改后在这里它又重新调用post()方法将updatethread加入线程队列。
由此循环。

二.了解handler

1.可以说handler是线程之间的通讯兵,他的作用就是发送和处理消息,就像intent对于Activity一样。可以通过Handler将Message对象发送到该Handler所关联线程的MessageQueue(消息队列)中,然后该消息队列一直在循环拿出一个Message,对其进行处理。

主线程:

也叫UI线程,或称ActivityThread,用于运行四大组件和处理他们用户的交互。 ActivityThread管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),在Android系统中,在默认情况下,一个应用程序内的各个组件(如Activity、BroadcastReceiver、Service)都会在同一个进程(Process)里执行,且由此进程的主线程负责执行。
ActivityThread既要处理Activity组件的UI事件,又要处理Service后台服务工作,通常会忙不过来。为了解决此问题,主线程可以创建多个子线程来处理后台服务工作,而本身专心处理UI画面的事件。

子线程:

用于执行耗时操作,比如 I/O操作和网络请求等。(安卓3.0以后要求耗访问网络必须在子线程种执行)更新UI的工作必须交给主线程,子线程在安卓里是不允许更新UI的。

2.handler只是一种工具,线程代码间承接的作用。我们把耗时操作放在子线程代码中完成,将相关结果,例如参数,传回主线程。从而让主线程执行其他操作,例如更改UI。
3.当然,我们也可以在主线程中实例化handler,在重写的handlemassage()方法中执行相关代码,然后通过handler发送消息给子线程。例如在Activity中通过用户输入某些数据,然后操作这些数据的代码放在子线程中,这样就不会出现响应时间过长的错误。所以说handler的实例化可以在UI线程也可以在子线程。
4.在子线程中创建handler,的步骤:

1 Looper.prepare()创建Looper对象,同时他会自动创建消息队列MessageQueue对象,就像它的名字一样,它的作用就是不断地从消息队列中取出消息,并将其给对应的Handler处理。
2.创建Handler实例,重写handlemassage()
3.调用Looper的loop()启动Looper

阅读全文
0 0