Android(5)Handler和Bundle

来源:互联网 发布:琅琊榜骑兵进阶数据 编辑:程序博客网 时间:2024/06/06 15:51


1 Handler的简单使用

注意:handler对线程的处理post,并不是启动了一个新的线程,而是在当前线程调用run方法。

1.1 当触发startbtn的方法后,每隔3秒打印一次日志;当endbtn被点击后,才不再循环打印日志。

public class HandlerActivity extends Activity{    private Button startbtn = null, endbtn = null;    // 创建一个handler对象    Handler handler = new Handler();    // 将要执行的操作写在线程对象的run方法中    Runnable updateThread = new Runnable() {@Overridepublic void run() {System.out.println("UpdateThread");// 在此执行postDelayed或者post方法,循环工作handler.postDelayed(updateThread, 3000);}};    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                startbtn = (Button) findViewById(R.id.startbutton);        endbtn = (Button) findViewById(R.id.endbutton);                startbtn.setOnClickListener(new StartBtnListener());        endbtn.setOnClickListener(new EndBtnListener());    }    class StartBtnListener implements OnClickListener {@Overridepublic void onClick(View v) {// 调用handler的post方法,将要执行的线程对象添加到队列中handler.post(updateThread);}    }    class EndBtnListener implements OnClickListener {@Overridepublic void onClick(View v) {handler.removeCallbacks(updateThread);}    }        }

1.2 将Handler与Progressbar结合,不断更新进度条

理解线程队列和消息队列

public class HandlerActivity extends Activity{private ProgressBar bar = null;    private Button startbtn = null;        protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                startbtn = (Button) findViewById(R.id.startbutton);        startbtn.setOnClickListener(new StartBtnListener());                bar = (ProgressBar) findViewById(R.id.bar);            }    class StartBtnListener implements OnClickListener {@Overridepublic void onClick(View v) {bar.setVisibility(View.VISIBLE);updateBarHandler.post(updateThread);}        }        Handler updateBarHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);bar.setProgress(msg.arg1);updateBarHandler.post(updateThread);}    };        // 线程类, 该类使用匿名内部类的方式进行声明    Runnable updateThread = new Runnable() {int i = 0;    @Overridepublic void run() {System.out.println("Begin Thread");i = i + 10;// 得到一个消息对象,Message类是由android操作系统提供Message msg = updateBarHandler.obtainMessage();msg.arg1 = i; // 使用arg1成员变量传递参数try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}// 将msg对象加入到消息队列当中updateBarHandler.sendMessage(msg);if(i==100) {System.out.println("thread end end end !");updateBarHandler.removeCallbacks(updateThread);}}};    }

2 通过HandlerThread和Handler实现新开线程处理msg,通过Bundle对象承载Msg的数据

通过HandlerThread获取Looper,交给Handler,从而实现Handler在新开线程中对msg的处理

public class HandlerActivity extends Activity{    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                setContentView(R.layout.main);                System.out.println("acitivty--->"+Thread.currentThread().getId());        System.out.println("activityName-->" + Thread.currentThread().getName());                HandlerThread handlerthread = new HandlerThread("new_thread");        handlerthread.start();                MyHandler myhandler = new MyHandler(handlerthread.getLooper());        Message msg = myhandler.obtainMessage();        msg.obj = "abc";        Bundle b = new Bundle();        b.putInt("age", 20);        b.putString("name", "jhon");        msg.setData(b);        msg.sendToTarget(); // 消息发送给目标对象,也就是调用obtainMessage方法的对象//        myhandler.sendMessage(msg);    }    class MyHandler extends Handler {    public MyHandler() {}    public MyHandler(Looper looper) {    super(looper);    }@Overridepublic void handleMessage(Message msg) { // 在新线程当中处理msgSystem.out.println("handler---->"+Thread.currentThread().getId());    System.out.println("handleMessage " + msg.obj + msg.getData().getString("name"));}        }}


























原创粉丝点击