zoukankan      html  css  js  c++  java
  • Android之Handler

    1.Handler默认情况下与主线程处于同一线程

    public class MainActivity extends Activity {
    
        private Button startButton = null;
        private Button endButton = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            startButton = (Button) findViewById(R.id.startButton);
            endButton = (Button) findViewById(R.id.endButton);
    
            startButton.setOnClickListener(new StartButtonListener());
            endButton.setOnClickListener(new EndButtonListener());
    
            /*
             * if (savedInstanceState == null) {
             * getSupportFragmentManager().beginTransaction() .add(R.id.container,
             * new PlaceholderFragment()).commit(); }
             */
        }
    
        class StartButtonListener implements OnClickListener {
            @Override
            public void onClick(View v) {
                System.out.println(Thread.currentThread().getId() + " Start");
                handler.post(updateThread);
            }
        }
    
        class EndButtonListener implements OnClickListener {
            @Override
            public void onClick(View v) {
                System.out.println(Thread.currentThread().getId() + " End");
                handler.removeCallbacks(updateThread);
            }
        }
    
        Handler handler = new Handler();
        Runnable updateThread = new Runnable() {
            @Override
            public void run() {
                System.out
                        .println(Thread.currentThread().getId() + " UpdateThread");
                handler.postDelayed(updateThread, 3000);
            }
        };

    2.通过Handler实现进度条

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        tools:context="com.example.mars_1200_progressbarhandler.MainActivity"
        tools:ignore="MergeRootFrame" >
    
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="hello" />
    
        <ProgressBar
            android:id="@+id/bar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:visibility="gone" />
    
        <Button
            android:id="@+id/startButton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="start" />
    
    </LinearLayout>
    public class MainActivity extends Activity {
    
        ProgressBar bar = null;
        Button startButton = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            System.out.println("主线程ID:"+Thread.currentThread().getId());
            bar = (ProgressBar) findViewById(R.id.bar);
            startButton = (Button) findViewById(R.id.startButton);
            startButton.setOnClickListener(new ButtonListener());
            /*
             * if (savedInstanceState == null) {
             * getSupportFragmentManager().beginTransaction() .add(R.id.container,
             * new PlaceholderFragment()).commit(); }
             */
        }
    
        class ButtonListener implements OnClickListener {
            @Override
            public void onClick(View v) {
                bar.setVisibility(View.VISIBLE);
                updateBarHandler.post(updateThread);
            }
        }
    
        //使用匿名内部类
        Handler updateBarHandler = new Handler() {
            //可传递参数
            @Override
            public void handleMessage(Message msg) {
                bar.setProgress(msg.arg1);
                updateBarHandler.post(updateThread);
            }
        };
    
        //线程类,该类使用匿名内部类的方式进行声明
        Runnable updateThread = new Runnable() {
            int i = 0;
            @Override
            public void run() {
                System.out.println("Begin Thread");
                System.out.println("Handler线程ID:"+Thread.currentThread().getId());
                i = i + 10;
                //得到一个消息,Message类是有Android操作系统提供的
                Message msg = updateBarHandler.obtainMessage();
                //将msg对象的arg1参数的值设置为i,用arg1和arg2这两个
                //成员变量传递值,优点是消耗性能小
                msg.arg1 = i;
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                updateBarHandler.sendMessage(msg);
                if (i >= 100) {
                    updateBarHandler.removeCallbacks(updateThread);
                }
            }
        };

    3.Handler通过post执行Runnable(还是与主线程处于同一线程)

    public class MainActivity extends Activity {
        private Handler handler = new Handler();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //handler线程和主线程在同一线程
            handler.post(r);
            /*Thread t=new Thread(r);
            t.start();*/
            
            System.out.println("activity-->" + Thread.currentThread().getId());
            System.out.println("activityname-->" + Thread.currentThread().getId());
            /*
             * if (savedInstanceState == null) {
             * getSupportFragmentManager().beginTransaction() .add(R.id.container,
             * new PlaceholderFragment()).commit(); }
             */
        }
    
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("handler-->" + Thread.currentThread().getId());
                System.out.println("handlername-->"
                        + Thread.currentThread().getName());
                try {
                    Thread.sleep(10000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

    4.通过HandlerThread执行线程,并可通过Bundle传递参数

    public class MainActivity02 extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main_activity02);
    
            System.out.println(Thread.currentThread().getId());
            //生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android提供
            HandlerThread handlerThread=new HandlerThread("handler_Thread");
            handlerThread.start();
            MyHandler myHandler=new MyHandler(handlerThread.getLooper());
            Message msg=myHandler.obtainMessage();
            msg.obj="abc";//通过obj存储数据
            Bundle b=new Bundle();
            b.putInt("age", 20);
            b.putString("name", "Jhon");
            msg.setData(b);//通过Bundle存储数据
            msg.sendToTarget();//将msg发送到目标对象,所谓的目标对象就是生成该msg的Handler
            /*if (savedInstanceState == null) {
                getSupportFragmentManager().beginTransaction()
                        .add(R.id.container, new PlaceholderFragment()).commit();
            }*/
        }
    
        class MyHandler extends Handler{
            public MyHandler(){
                
            }
            public MyHandler(Looper looper){
                super(looper);
            }
            @Override
            public void handleMessage(Message msg){
                System.out.println(msg.obj);
                Bundle b=msg.getData();
                System.out.println(b.getInt("age"));
                System.out.println(b.getString("name"));
                System.out.println("handleMessage:"+Thread.currentThread().getId());
            }
        }
  • 相关阅读:
    学习4412开发板gdb和gdbserver的调试
    S5P4418开发板android源码下uboot和内核缺省文件的配置
    IMX6开发板Qtopia2.2.0开发环境搭建以及编译镜像
    IMX6Q开发板LinuxQT挂载U盘及TF卡
    没有更好的,五种操作系统助力研发,IMX6开发板做得到
    iTOPiMX6UL开发板MiniLinuxCAN测试使用文档
    Exynos4412开发板网络同一网段
    分享几个4412开发板新录制的视频,不是VIP也能看
    itop4412开发版安卓系统卸载默认apk使用文档
    一个总经理的11个经典面试问题
  • 原文地址:https://www.cnblogs.com/zhuawang/p/3647734.html
Copyright © 2011-2022 走看看