Handler认识初步(一)

来源:互联网 发布:混合高斯模型的em算法 编辑:程序博客网 时间:2024/06/06 02:00
package chine.joy.test;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;/** * Handler主要接受 子线程发过来的数据,并用此数据配合主线程更新UI * 当应用程序启动时,安卓会首先开启一个主线程,主线程主要是进行 UI更新和事件分发,比如按下按钮,Android就把点击事件 * 分发到Button上,又比如你下载一个大文件或者是打开一个大的本地文件,要是在主线程中进行,超过5秒要是还没下载下来或者 * 打开文件,安卓系统就会提示你“强制关闭”,所以要把耗时的操作放在子线程中处理,但是子线程数据更新会对UI更新,在主线程 * 以外的线程中更新UI是不安全的,所以要 Handler在主线程中接受要更新的数据,在子线程中发送数据。 * 由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候, * Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  ,  * 把这些消息放入主线程队列中,配合主线程进行更新UI。Handler主要进行 异步消息的处理,所谓异步消息就是sendMessage(msg) * 把消息对象加到消息队列中后,发送消息的方法就返回了,代码继续向下进行。在另外一个部分中(handleMessage(Message msg)) * 对消息队列中的消息逐个的进行处理。发送消息和接受消息不是同步的进行。 * @author joychine *下面是每隔1妙就更新进度条的进度(i=i+10) */public class HandlerTest1Activity extends Activity {private Button startButton;private ProgressBar bar;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        startButton = (Button) findViewById(R.id.startButton);        bar = (ProgressBar) findViewById(R.id.bar);        startButton.setOnClickListener(new ButtonListener());      //这句话会和Runnable的run()方法中的输出一样,证明Handler.post(r)其实是执行了Runnable中的        //run()方法没有执行start()方法。        System.out.println(Thread.currentThread().getId());
            }    class ButtonListener implements OnClickListener {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubbar.setVisibility(View.VISIBLE);myhHandler.post(updateRunnable);//这里其实是直接执行了Runnable的对象并没有新起一个线程//并没有调用线程 的start()方法,而是直接调用了线程的run()方法。}    } // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据             // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象            // (2): 让一个动作,在不同的线程中执行.               // 它安排消息,用以下方法           // post(Runnable)           // postAtTime(Runnable,long)           // postDelayed(Runnable,long)            // sendEmptyMessage(int)            // sendMessage(Message);            // sendMessageAtTime(Message,long)            // sendMessageDelayed(Message,long)                      // 以上方法以 post开头的允许你处理Runnable对象            //sendMessage()允许你处理Message对象(Message里可以包含数据,)    Handler myhHandler = new Handler() {     // 子类必须重写此方法,接受数据@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubbar.setProgress(msg.arg1);myhHandler.post(updateRunnable);}        };     Runnable updateRunnable  = new Runnable() {int i=0 ;@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println(Thread.currentThread().getId());i=i+10;/*Bundle bundle = new Bundle();bundle.putString("aa", "卡看");msg.setData(bundle)*///用Handler对象获得一个 Message对象Message msg = myhHandler.obtainMessage();msg.arg1 = i;try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}//向主线程发送数据更新UImyhHandler.sendMessage(msg);if (i==100) {myhHandler.removeCallbacks(updateRunnable);}}};}

原创粉丝点击