Handler的使用

关于Handler的使用需要分为2种情况:

  • Handler与Java中的Thread一起使用。

具体流程是这样的:有个耗时的操作,在MainActivity中启动一个Service,在该Service中启动一个Java的Thread来执行这个耗时操作,执行完成后将结果通过Handler的SendMessage()从该Thread发送到MainThread,在MainThread中通过Handler的handleMessage()来处理传送过来的结果,比如更新UI。

  • Handler与Android中的HandlerThread和Looper一起使用。

具体流程时这样的:有个耗时的操作,在MainActivity中启动一个Service,在该Service中启动一个HandlerThread(这时便启动了一个新的线程),之后创建自己Handler继承自Handler,在自己的Handler构造函数中使用一个带Looper参数的形式,并在实现时使用super(looper); 同时实现该Handler的handleMessage()方法,在handleMessage()中来执行这个耗时操作,执行完成后将结果通过另一个Handler(Handler B)的sendMessage()从该HandlerThread发送到MainThread,在MainThread中通过Handler B的handleMessage()来处理传送过来的结果,比如更新UI。

Handler与Java中的Thread一起使用 
public class MyService extends Service {
   
    public static final String TAG = "MyService";
    public static final int MSG_TASK_ADD_DONE = 1000;
   
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {//使用Handler处理消息,在Main Thread
            Log.d(TAG, "handleMessage() thread id: " + Thread.currentThread().getId());
            switch(msg.what)
            {
                case MSG_TASK_ADD_DONE:
                {
                    IActivity confuseActivity = (IActivity) MyUtils.getActivityByName("MyConfuseActivity");
                    confuseActivity.updateContent(msg.arg1);
                    break;
                }
            }
        }
       
    };

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
       
        final int num1 = intent.getIntExtra("num1", 0);
        final int num2 = intent.getIntExtra("num2", 0);
       
        new Thread() {
            @Override
            public void run() {// Own thread
                Log.d(TAG, "run() thread id: " + Thread.currentThread().getId());
                int result = num1 + num2;// Perform some complex operations in own thread
               
                // Send msgTaskAddDone with result to main thread to update UI
                Message msgTaskAddDone = handler.obtainMessage();//使用Handler创建消息
                msgTaskAddDone.what = MSG_TASK_ADD_DONE;
                msgTaskAddDone.arg1 = result;
               
                handler.sendMessage(msgTaskAddDone);//使用Handler发送消息
            }
        }.start();
       
        return super.onStartCommand(intent, flags, startId);
    }

}

Handler与Android中的HandlerThread和Looper一起使用。 
public class YourService extends Service {
    
    public static final String TAG = "YourService";
    public static final int MSG_TASK_SUB = 1001;
    public static final int MSG_TASK_SUB_DONE = 1002;
    
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {// Main thread
            switch(msg.what)
            {
            case MSG_TASK_SUB_DONE:
                IActivity confuseActivity = (IActivity) MyUtils.getActivityByName("MyConfuseActivity");
                confuseActivity.updateContent(msg.arg1);
                break;
            default:
                break;
            }
        }
       
    };
    
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
       
        Log.d(TAG, "onStartCommand() thread id: " + Thread.currentThread().getId());
       
        HandlerThread handlerThread = new HandlerThread("handler_thread");
        handlerThread.start();
       
        Handler handler = new MyHandler(handlerThread.getLooper());
       
        Message msg = handler.obtainMessage();
        msg.what = MSG_TASK_SUB;
        msg.arg1 = intent.getIntExtra("num1", 0);
        msg.arg2 = intent.getIntExtra("num2", 0);
        handler.sendMessage(msg);
       
        return 0;
    }
    
    public class MyHandler extends Handler {
       
        public MyHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {// Own thread
           
            Log.d(TAG, "MyHandler:handleMessage() thread id: " + Thread.currentThread().getId());
            int result = -1;
           
            switch(msg.what)
            {
            case MSG_TASK_SUB:
                result = msg.arg1 - msg.arg2;// Perform some complex operations in own thread
                break;
            default:
                break;
            }
           
            // Send msgTaskSubDone with result to main thread to update UI
            Message msgTaskSubDone = handler.obtainMessage();
            msgTaskSubDone.what = MSG_TASK_SUB_DONE;
            msgTaskSubDone.arg1 = result;
            msgTaskSubDone.sendToTarget();
        }

    }
}

MainActivity的代码:
public class MyConfuseActivity extends Activity implements OnClickListener, IActivity {
   
    public static final String TAG = "MyConfuseActivity";
    private Button btn_add = null;
    private Button btn_sub= null;
    private TextView tvDisplayResult = null;
   
    private Intent intent = null;
   
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
       
        Log.d(TAG, "MyConfuseActivity thread id: " + Thread.currentThread().getId());
       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        btn_add = (Button) this.findViewById(R.id.btn_add);
        btn_add.setOnClickListener(this);
       
        btn_sub = (Button) this.findViewById(R.id.btn_sub);
        btn_sub.setOnClickListener(this);
       
        tvDisplayResult = (TextView) this.findViewById(R.id.tv_displayResult);
       
        intent = new Intent(this, MyService.class);
        //intent = new Intent(this, YourService.class);
        intent.putExtra("num1", 5555);
        intent.putExtra("num2", 2224);
       
        MyUtils.addActivity(this);
    }
   
    public void onClick(View v) {
        switch(v.getId())
        {
        case R.id.btn_add:
            this.startService(intent);
            break;
        case R.id.btn_sub:
            //this.startService(intent);
            break;
        default:
            break;
        }
    }

    public void updateContent(Object obj) {
        if(tvDisplayResult != null) {
            tvDisplayResult.setText("返回的结果是 " + (Integer) obj);
        }
    }
   
}

MyUtils的代码:
public class MyUtils { 
    private static ArrayList<Activity> appActivities = new ArrayList<Activity>();
   
    public static Activity getActivityByName(String name) {
        if(!appActivities.isEmpty()) {
            for (Activity activity : appActivities) {
                if(null != activity) {
                    if(activity.getClass().getName().indexOf(name) > 0) {
                        return activity;
                    }
                }
            }
        }
        return null;
    }
   
    public static void addActivity(Activity activity) {
        appActivities.add(activity);
    }

}
View Code

转载:http://blog.sina.com.cn/s/blog_51335a0001018pg9.html  

posted on 2013-08-13 15:26  Codebaby  阅读(352)  评论(0)    收藏  举报

导航