zoukankan      html  css  js  c++  java
  • Android_Handler

    xml文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.example.handler.MainActivity" >
        <ProgressBar 
            android:id="@+id/progressBar"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:visibility="gone"
            style="?android:attr/progressBarStyleHorizontal"
         />
        <Button 
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="start"
            android:textSize="20sp"/>
        
      
    </LinearLayout>

    源代码:

    main1:

    package com.example.handler;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ProgressBar;
    /**
     * Handler:安卓提供的异步线程处理方式
     * 
     * Handler的使用
             * 创建一个Handler对象
             * 调用Handler的post方法,将要执行的线程对象添加到队列当中
             * 将要执行的操作写在线程对象当中
             * 在Run方法内部执行postDelayed或者post方法实现循环
     *    
     *分析:调用post方法,将要执行的线程对象或消息对象添加到队列当中,然后该方法return,
     *        Handler中HanderMessage负责接收消息队列中的消息,
     *        从而实现异步处理,互不影响
     */
    /**
     * 例程:
     *     利用Handler处理一个进度条
     * @author Administrator
     *
     */
    public class MainActivity extends Activity implements OnClickListener,Runnable {
        
        private Button button;
        private ProgressBar progressBar    ;
        private Thread thread;
        private int i = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = (Button) findViewById(R.id.button);
            progressBar = (ProgressBar) findViewById(R.id.progressBar);
            button.setOnClickListener(this);
            thread = new Thread(this);
            thread.start();
            
        }
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            progressBar.setVisibility(i);
            handler.post(thread);//将线程对象加入到线程对象当中
        }
        //使用匿名内部类来复写Handler当中的handlerMessage方法
        Handler handler = new Handler(){
            //接收消息队列中的消息
            public void handleMessage(Message msg) {
                progressBar.setVisibility(msg.arg1);
                handler.post(thread);
                System.out.println(handler+"....."+Thread.currentThread().getName());
            };
        };
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("Thread.........."+Thread.currentThread().getName());
            i = i+10;
            //得到一个消息对象,Message类是由安卓操作系统提供
            Message msg = handler.obtainMessage();
            //将msg对象的arg1参数设置为i,用arg1和arg2成员变量传递消息,优点是新系统性能消耗较少
            msg.arg1 = i;
            try {
                //设置当前线程休眠1S
                thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //将消息对象加入到消息队列中
            handler.sendMessage(msg);
            if(i==100){
                //在Handler中移除当前线程
                handler.removeCallbacks(thread);
            }
            
            
        }
        
        
    
    }

    main2:

    package com.example.handler;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.HandlerThread;
    import android.os.Looper;
    import android.os.Message;
    /**
     * 为了避免启动一个活动处理事件的时间过长导致该活动没有响应,一般我们处理数据量比较大的数据时,会将其分别放置在几个线程里面,实现异步处理数据
     * @author Administrator
     *
     */
    public class MainActivity2 extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
            System.out.println("activity-->"+Thread.currentThread().getName());
            //生成了一个handlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由安卓应用程序框架提供
            //looper会循环从队列中取出消息
            HandlerThread handlerThread = new HandlerThread("handler_thread");
            //在使用handlerThread.getLooper()方法之前必须先开启线程
            handlerThread.start();
            //将Handler通过getLooper方法绑定在了调用Looper的线程上
            MyHandler handler = new MyHandler(handlerThread.getLooper());
            Message msg = handler.obtainMessage();
            Bundle data = new Bundle();
            data.putString("name", "zhangsan");
            data.putInt("age", 20);
            msg.obj = "abc";
            msg.setData(data);
            //将msg发送到目标对象,所谓的目标对象就是生成该msg对象的handler对象
            msg.sendToTarget();
        }
    }
    class MyHandler extends Handler{
        public MyHandler(){
            
        }
        public MyHandler(Looper looper){
            super(looper);
        }
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            String obj = (String) msg.obj;
            Bundle data = msg.getData();
            String name = data.getString("name");
            int age = data.getInt("age");
            System.out.println(name+"::"+age);
            System.out.println("handler-->"+Thread.currentThread().getName());
        }
    }
  • 相关阅读:
    入门学习
    SQL语句
    Jmeter录制badboy
    post方式提交数据
    get向服务器提交数据
    手机端解析json
    生成JSON字符串
    新闻客户端
    从网络下载的图片加缓存功能
    消息队列机制messageQuene
  • 原文地址:https://www.cnblogs.com/fangg/p/5583068.html
Copyright © 2011-2022 走看看