创建Handler的方式:
1) new Handler()
创建目前正在执行此指令的线程的Handler对象,其Looper通过Looper.Looper.myLooper()获取
2) new Handler(Looper)
创建指定Looper线程的Handler对象, 如new Handler(Looper.getMainLooper())创建主线程的Handler对象
static final int KEEP_SCREEN_ON_MSG = 1; static final int GET_NEW_SURFACE_MSG = 2; static final int UPDATE_WINDOW_MSG = 3; final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case KEEP_SCREEN_ON_MSG: { setKeepScreenOn(msg.arg1 != 0); } break; case GET_NEW_SURFACE_MSG: { handleGetNewSurface(); } break; case UPDATE_WINDOW_MSG: { updateWindow(false, false); } break; } } }; //发送空消息 mHandler.sendEmptyMessage(UPDATE_WINDOW_MSG); //发送一个Message Message msg = mHandler.obtainMessage(GET_NEW_SURFACE_MSG); mHandler.sendMessage(msg);
发送Message方案二:
class AudioHandler extends Handler { private void setDeviceVolume(VolumeStreamState streamState, int device) { //do something } private void setAllVolumes(VolumeStreamState streamState) { //do something } @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SET_DEVICE_VOLUME: setDeviceVolume((VolumeStreamState) msg.obj, msg.arg1); break; case MSG_SET_ALL_VOLUMES: setAllVolumes((VolumeStreamState) msg.obj); break; // ... } } }
发送Runnable方案三:
public class MainActivity extends Activity { private Handler h; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); h = new Handler(){ public void handleMessage(Message msg) { //do nothing } }; h.post(new myRun()); } class myRun implements Runnable{ public void run(){ setTitle(String.valueOf(1)); h.postDelayed(testRun, 2000); } } Runnable testRun= new Runnable() { public void run(){ setTitle(String.valueOf(2)); } }; }
Looper.prepare(); // 创建Handler Looper.loop(); // 在此线程中创建的Handler将向Looper的MessageQueue发送消息
new Thread(){ public void run(){ //do something you want to do } }.start();
class Task implements Runnable { public void run() { // do something you want to do } } Task ta = new Task(); Thread t1 = new Thread(ta, "MyTask"); t1.start();
class MyThread extends Thread { public MyThread() { super("MyThread"); } @Override public void run() { Looper.prepare(); mMyLooper = Looper.myLooper(); mAudioHandler = new AudioHandler(); //do something you want to do Looper.loop(); } } AudioHandler mAudioHandler; Looper mMyLooper; MyThread mMyThread = new MyThread(); mMyThread.start(); //启动线程 // wait some event mMyLooper.quit(); //使线程退出
在SurfaceView中实现的SurfaceHolder如下:
private SurfaceHolder mSurfaceHolder = new SurfaceHolder() { private static final String LOG_TAG = "SurfaceHolder"; public boolean isCreating() { return mIsCreating; } public void addCallback(Callback callback) { synchronized (mCallbacks) { // This is a linear search, but in practice we'll // have only a couple callbacks, so it doesn't matter. if (mCallbacks.contains(callback) == false) { mCallbacks.add(callback); } } } public void removeCallback(Callback callback) { synchronized (mCallbacks) { mCallbacks.remove(callback); } } public void setFixedSize(int width, int height) { if (mRequestedWidth != width || mRequestedHeight != height) { mRequestedWidth = width; mRequestedHeight = height; requestLayout(); } } public void setSizeFromLayout() { if (mRequestedWidth != -1 || mRequestedHeight != -1) { mRequestedWidth = mRequestedHeight = -1; requestLayout(); } } public void setFormat(int format) { // for backward compatibility reason, OPAQUE always // means 565 for SurfaceView if (format == PixelFormat.OPAQUE) format = PixelFormat.RGB_565; mRequestedFormat = format; if (mWindow != null) { updateWindow(false, false); } } /** * @deprecated setType is now ignored. */ @Deprecated public void setType(int type) { } public void setKeepScreenOn(boolean screenOn) { Message msg = mHandler.obtainMessage(KEEP_SCREEN_ON_MSG); msg.arg1 = screenOn ? 1 : 0; mHandler.sendMessage(msg); } public Canvas lockCanvas() { return internalLockCanvas(null); } public Canvas lockCanvas(Rect dirty) { return internalLockCanvas(dirty); } private final Canvas internalLockCanvas(Rect dirty) { mSurfaceLock.lock(); if (DEBUG) Log.i(TAG, "Locking canvas... stopped=" + mDrawingStopped + ", win=" + mWindow); Canvas c = null; if (!mDrawingStopped && mWindow != null) { if (dirty == null) { if (mTmpDirty == null) { mTmpDirty = new Rect(); } mTmpDirty.set(mSurfaceFrame); dirty = mTmpDirty; } try { c = mSurface.lockCanvas(dirty); } catch (Exception e) { Log.e(LOG_TAG, "Exception locking surface", e); } } if (DEBUG) Log.i(TAG, "Returned canvas: " + c); if (c != null) { mLastLockTime = SystemClock.uptimeMillis(); return c; } // If the Surface is not ready to be drawn, then return null, // but throttle calls to this function so it isn't called more // than every 100ms. long now = SystemClock.uptimeMillis(); long nextTime = mLastLockTime + 100; if (nextTime > now) { try { Thread.sleep(nextTime-now); } catch (InterruptedException e) { } now = SystemClock.uptimeMillis(); } mLastLockTime = now; mSurfaceLock.unlock(); return null; } public void unlockCanvasAndPost(Canvas canvas) { mSurface.unlockCanvasAndPost(canvas); mSurfaceLock.unlock(); } public Surface getSurface() { return mSurface; } public Rect getSurfaceFrame() { return mSurfaceFrame; } }
public class MainActivity extends Activity { ProgressDialog mDialog; MyThread mThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // create and display the progress in a new thread mDialog = new ProgressDialog(MainActivity.this); mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mDialog.setTitle("MyTitle"); //mDialog.setIcon(R.drawable.icon); mDialog.setMessage("This is a progress example!"); mDialog.setMax(100); mDialog.setProgress(0); //mDialog.setSecondaryProgress(50); mDialog.setIndeterminate(false); mDialog.setCancelable(true); mDialog.show(); mThread = new MyThread(); mThread.start(); } public class MyThread extends Thread { MyThread(){ super("MyThread"); } @Override public void run(){ int i=0; while(i<100){ i++; // set the progress value mDialog.setProgress(i); try{ Thread.sleep(100); // sleep 1s }catch(InterruptedException e){ e.printStackTrace(); } } // destroy the progress mDialog.dismiss(); } } }
package com.example.mytest; import java.util.Timer; import java.util.TimerTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { private Timer timer = new Timer(); private Handler h; private int k = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); h = new Handler(){ public void handleMessage(Message msg) { setTitle((String)msg.obj); } }; // init and start the timer init(); } public void init() { //public abstract class TimerTask implements Runnable TimerTask task = new TimerTask(){ @Override public void run() { h.removeMessages(0); Message m = h.obtainMessage(1, 1, 1,Thread.currentThread().getName() + " : "+String.valueOf(k++)); h.sendMessage(m); } }; // after 500ms execute task firstly, then every 1000ms execute the task timer.schedule(task, 500, 1000); //启动Timer线程 } }