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); } }
转载:http://blog.sina.com.cn/s/blog_51335a0001018pg9.html
浙公网安备 33010602011771号