Tears_fg

导航

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());
    }
}

 

posted on 2016-06-14 10:16  Tears_fg  阅读(181)  评论(0编辑  收藏  举报