package com.example.myhandlerdemo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.util.Log; import android.widget.TextView; /** * UIHandler - 主线程: 更新UI * * ExecHandler - 子线程: 计算加法 * * 1. onCreate中对其进行初始化 * 2. onResume中对ExecHandler sendMessage() * 3. ExecHandler handleMessage()后,再sendMessage()给UIHandler * 4. UIHandler 在handleMessage()中更新UI * * @author April * */ public class MainActivity extends Activity { private static final String FROM = "from"; private static final String TO = "to"; private static final int MSG_ADD = 1; private UIHandler mUIHandler; private ExecHandler mExecHandler; private HandlerThread mSubThread; private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) this.findViewById(R.id.tv); //UI thread mUIHandler = new UIHandler(); //sub thread mSubThread = new HandlerThread("execthread"); mSubThread.start(); mExecHandler = new ExecHandler(mSubThread.getLooper()); } @Override protected void onResume() { super.onResume(); Log.d("gxq", "main thread: " + Thread.currentThread().getId()); //sub thread :add 1+2+..+100 Message msg = mExecHandler.obtainMessage(MSG_ADD); Bundle bundle = new Bundle(); bundle.putInt(FROM, 1); bundle.putInt(TO, 100); msg.setData(bundle); mExecHandler.sendMessage(msg); } class UIHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_ADD: mTextView.setText("result : " + msg.arg1); break; } } } class ExecHandler extends Handler { public ExecHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_ADD: Bundle bundle = new Bundle(); bundle = msg.getData(); int from = (Integer) bundle.get(FROM); int to = (Integer) bundle.get(TO); int sum = add(from, to); Message message = mUIHandler.obtainMessage(MSG_ADD); message.arg1 = sum; mUIHandler.sendMessage(message); break; } } } public int add(int from, int to) { Log.d("gxq", "add thread: " + Thread.currentThread().getId()); int sum = 0; for (int i = from; i < to; i++) { sum += i; } return sum; } }